79 lines
1.9 KiB
JavaScript
79 lines
1.9 KiB
JavaScript
// Copyright 2012 Mark Cavage, Inc. All rights reserved.
|
|
|
|
'use strict';
|
|
|
|
var assert = require('assert-plus');
|
|
var querystring = require('qs');
|
|
|
|
var bodyReader = require('./bodyReader');
|
|
var errors = require('restify-errors');
|
|
|
|
///--- Globals
|
|
|
|
var MIME_TYPE = 'application/x-www-form-urlencoded';
|
|
|
|
///--- API
|
|
|
|
/**
|
|
* Returns a plugin that will parse the HTTP request body IFF the
|
|
* contentType is application/x-www-form-urlencoded.
|
|
*
|
|
* If req.params already contains a given key, that key is skipped and an
|
|
* error is logged.
|
|
*
|
|
* @public
|
|
* @function urlEncodedBodyParser
|
|
* @param {Object} options - an option sobject
|
|
* @returns {Function} Handler
|
|
*/
|
|
function urlEncodedBodyParser(options) {
|
|
var opts = options || {};
|
|
assert.object(opts, 'opts');
|
|
|
|
var override = opts.overrideParams;
|
|
|
|
function parseUrlEncodedBody(req, res, next) {
|
|
// save original body on req.rawBody and req._body
|
|
req.rawBody = req._body = req.body;
|
|
|
|
if (req.getContentType() !== MIME_TYPE || !req.body) {
|
|
next();
|
|
return;
|
|
}
|
|
|
|
try {
|
|
var params = querystring.parse(req.body);
|
|
|
|
if (opts.mapParams === true) {
|
|
var keys = Object.keys(params);
|
|
keys.forEach(function forEach(k) {
|
|
var p = req.params[k];
|
|
|
|
if (p && !override) {
|
|
return;
|
|
}
|
|
req.params[k] = params[k];
|
|
});
|
|
}
|
|
|
|
req.body = params;
|
|
} catch (e) {
|
|
next(new errors.InvalidContentError(e.message));
|
|
return;
|
|
}
|
|
|
|
req.log.trace('req.params now: %j', req.params);
|
|
next();
|
|
}
|
|
|
|
var chain = [];
|
|
|
|
if (!opts.bodyReader) {
|
|
chain.push(bodyReader(opts));
|
|
}
|
|
chain.push(parseUrlEncodedBody);
|
|
return chain;
|
|
}
|
|
|
|
module.exports = urlEncodedBodyParser;
|