10
var bytes = require('bytes')
11
var deprecate = require('depd')('body-parser')
12
var read = require('../read')
13
var typer = require('media-typer')
14
var typeis = require('type-is')
20
module.exports = urlencoded
23
* Cache of parser modules.
26
var parsers = Object.create(null)
29
* Create a middleware to parse urlencoded bodies.
31
* @param {object} [options]
36
function urlencoded(options){
37
options = options || {};
39
// notice because option default will flip in next major
40
if (options.extended === undefined) {
41
deprecate('urlencoded: explicitly specify "extended: true" for extended parsing')
44
var extended = options.extended !== false
45
var inflate = options.inflate !== false
46
var limit = typeof options.limit !== 'number'
47
? bytes(options.limit || '100kb')
49
var type = options.type || 'urlencoded'
50
var verify = options.verify || false
52
if (verify !== false && typeof verify !== 'function') {
53
throw new TypeError('option verify must be function')
56
var queryparse = extended
58
: parser('querystring')
60
function parse(body) {
66
return function urlencodedParser(req, res, next) {
67
if (req._body) return next();
68
req.body = req.body || {}
70
if (!typeis(req, type)) return next();
72
var charset = typer.parse(req).parameters.charset || 'utf-8'
73
if (charset.toLowerCase() !== 'utf-8') {
74
var err = new Error('unsupported charset')
81
read(req, res, next, parse, {
91
* Get parser for module name dynamically.
93
* @param {string} name
98
function parser(name) {
99
var mod = parsers[name]
106
mod = parsers[name] = require(name)