2021-12-03 17:58:48 +01:00

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;