You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
2.1 KiB
100 lines
2.1 KiB
|
|
var getBody = require('raw-body');
|
|
var typeis = require('type-is');
|
|
var http = require('http');
|
|
var qs = require('qs');
|
|
|
|
exports = module.exports = bodyParser;
|
|
exports.json = json;
|
|
exports.urlencoded = urlencoded;
|
|
|
|
function bodyParser(options){
|
|
var _urlencoded = urlencoded(options);
|
|
var _json = json(options);
|
|
|
|
return function bodyParser(req, res, next) {
|
|
_json(req, res, function(err){
|
|
if (err) return next(err);
|
|
_urlencoded(req, res, next);
|
|
});
|
|
}
|
|
}
|
|
|
|
function json(options){
|
|
options = options || {};
|
|
var strict = options.strict !== false;
|
|
|
|
return function jsonParser(req, res, next) {
|
|
if (req._body) return next();
|
|
req.body = req.body || {};
|
|
|
|
if (!typeis(req, 'json')) return next();
|
|
|
|
// flag as parsed
|
|
req._body = true;
|
|
|
|
// parse
|
|
getBody(req, {
|
|
limit: options.limit || '100kb',
|
|
length: req.headers['content-length'],
|
|
encoding: 'utf8'
|
|
}, function (err, buf) {
|
|
if (err) return next(err);
|
|
|
|
var first = buf.trim()[0];
|
|
|
|
if (0 == buf.length) {
|
|
return next(error(400, 'invalid json, empty body'));
|
|
}
|
|
|
|
if (strict && '{' != first && '[' != first) return next(error(400, 'invalid json'));
|
|
try {
|
|
req.body = JSON.parse(buf, options.reviver);
|
|
} catch (err){
|
|
err.body = buf;
|
|
err.status = 400;
|
|
return next(err);
|
|
}
|
|
next();
|
|
})
|
|
};
|
|
}
|
|
|
|
function urlencoded(options){
|
|
options = options || {};
|
|
|
|
return function urlencodedParser(req, res, next) {
|
|
if (req._body) return next();
|
|
req.body = req.body || {};
|
|
|
|
if (!typeis(req, 'urlencoded')) return next();
|
|
|
|
// flag as parsed
|
|
req._body = true;
|
|
|
|
// parse
|
|
getBody(req, {
|
|
limit: options.limit || '100kb',
|
|
length: req.headers['content-length'],
|
|
encoding: 'utf8'
|
|
}, function (err, buf) {
|
|
if (err) return next(err);
|
|
|
|
try {
|
|
req.body = buf.length
|
|
? qs.parse(buf)
|
|
: {};
|
|
} catch (err){
|
|
err.body = buf;
|
|
return next(err);
|
|
}
|
|
next();
|
|
})
|
|
}
|
|
}
|
|
|
|
function error(code, msg) {
|
|
var err = new Error(msg || http.STATUS_CODES[code]);
|
|
err.status = code;
|
|
return err;
|
|
}
|