relu-core
Version:
102 lines (81 loc) • 2.65 kB
JavaScript
// Copyright 2012 Mark Cavage, Inc. All rights reserved.
;
var assert = require('assert-plus');
var errors = require('../errors');
var bodyReader = require('./body_reader');
var jsonParser = require('./json_body_parser');
var formParser = require('./form_body_parser');
var multipartParser = require('./multipart_body_parser');
var fieldedTextParser = require('./fielded_text_body_parser.js');
///--- Globals
var UnsupportedMediaTypeError = errors.UnsupportedMediaTypeError;
///--- API
/**
* parse the body of an incoming request.
* @public
* @function bodyParser
* @throws {UnsupportedMediaTypeError}
* @param {Object} options an option object
* @returns {Array}
*/
function bodyParser(options) {
assert.optionalObject(options, 'options');
options = options || {};
options.bodyReader = true;
var read = bodyReader(options);
var parseForm = formParser(options);
var parseJson = jsonParser(options);
var parseMultipart = multipartParser(options);
var parseFieldedText = fieldedTextParser(options);
function parseBody(req, res, next) {
// Allow use of 'requestBodyOnGet' flag to allow for merging of
// the request body of a GET request into req.params
if (req.method === 'HEAD') {
next();
return;
}
if (req.method === 'GET') {
if (!options.requestBodyOnGet) {
next();
return;
}
}
if (req.contentLength() === 0 && !req.isChunked()) {
next();
return;
}
var parser;
var type = req.contentType().toLowerCase();
switch (type) {
case 'application/json':
parser = parseJson[0];
break;
case 'application/x-www-form-urlencoded':
parser = parseForm[0];
break;
case 'multipart/form-data':
parser = parseMultipart;
break;
case 'text/tsv':
parser = parseFieldedText;
break;
case 'text/tab-separated-values':
parser = parseFieldedText;
break;
case 'text/csv':
parser = parseFieldedText;
break;
default:
break;
}
if (parser) {
parser(req, res, next);
} else if (options && options.rejectUnknown) {
next(new UnsupportedMediaTypeError(type));
} else {
next();
}
}
return ([read, parseBody]);
}
module.exports = bodyParser;