Initial commit for OpenECOMP SDN-C OA&M
[sdnc/oam.git] / dgbuilder / dgeflows / node_modules / body-parser / lib / read.js
diff --git a/dgbuilder/dgeflows/node_modules/body-parser/lib/read.js b/dgbuilder/dgeflows/node_modules/body-parser/lib/read.js
new file mode 100644 (file)
index 0000000..0880a3d
--- /dev/null
@@ -0,0 +1,153 @@
+/*!
+ * body-parser
+ * Copyright(c) 2014 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module dependencies.
+ */
+
+var getBody = require('raw-body')
+var iconv = require('iconv-lite')
+var onFinished = require('on-finished')
+var typer = require('media-typer')
+var zlib = require('zlib')
+
+/**
+ * Module exports.
+ */
+
+module.exports = read
+
+/**
+ * Read a request into a buffer and parse.
+ *
+ * @param {object} req
+ * @param {object} res
+ * @param {function} next
+ * @param {function} parse
+ * @param {object} options
+ * @api private
+ */
+
+function read(req, res, next, parse, options) {
+  var length
+  var stream
+
+  // flag as parsed
+  req._body = true
+
+  try {
+    stream = contentstream(req, options.inflate)
+    length = stream.length
+    delete stream.length
+  } catch (err) {
+    return next(err)
+  }
+
+  options = options || {}
+  options.length = length
+
+  var encoding = options.encoding !== null
+    ? options.encoding || 'utf-8'
+    : null
+  var verify = options.verify
+
+  options.encoding = verify
+    ? null
+    : encoding
+
+  // read body
+  getBody(stream, options, function (err, body) {
+    if (err) {
+      if (!err.status) {
+        err.status = 400
+      }
+
+      // echo back charset
+      if (err.type === 'encoding.unsupported') {
+        err = new Error('unsupported charset "' + encoding.toUpperCase() + '"')
+        err.charset = encoding.toLowerCase()
+        err.status = 415
+      }
+
+      // read off entire request
+      stream.resume()
+      onFinished(req, function onfinished() {
+        next(err)
+      })
+      return
+    }
+
+    // verify
+    if (verify) {
+      try {
+        verify(req, res, body, encoding)
+      } catch (err) {
+        if (!err.status) err.status = 403
+        return next(err)
+      }
+    }
+
+    // parse
+    try {
+      body = typeof body !== 'string' && encoding !== null
+        ? iconv.decode(body, encoding)
+        : body
+      req.body = parse(body)
+    } catch (err) {
+      if (!err.status) {
+        err.body = body
+        err.status = 400
+      }
+      return next(err)
+    }
+
+    next()
+  })
+}
+
+/**
+ * Get the content stream of the request.
+ *
+ * @param {object} req
+ * @param {boolean} [inflate=true]
+ * @return {object}
+ * @api private
+ */
+
+function contentstream(req, inflate) {
+  var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
+  var err
+  var length = req.headers['content-length']
+  var stream
+
+  if (inflate === false && encoding !== 'identity') {
+    err = new Error('content encoding unsupported')
+    err.status = 415
+    throw err
+  }
+
+  switch (encoding) {
+    case 'deflate':
+      stream = zlib.createInflate()
+      req.pipe(stream)
+      break
+    case 'gzip':
+      stream = zlib.createGunzip()
+      req.pipe(stream)
+      break
+    case 'identity':
+      stream = req
+      stream.length = length
+      break
+    default:
+      err = new Error('unsupported content encoding "' + encoding + '"')
+      err.encoding = encoding
+      err.status = 415
+      throw err
+  }
+
+  return stream
+}