urlencoded.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*!
  2. * body-parser
  3. * MIT Licensed
  4. */
  5. /**
  6. * Module dependencies.
  7. */
  8. var bytes = require('bytes')
  9. var deprecate = require('depd')('body-parser')
  10. var read = require('../read')
  11. var typer = require('media-typer')
  12. var typeis = require('type-is')
  13. /**
  14. * Module exports.
  15. */
  16. module.exports = urlencoded
  17. /**
  18. * Cache of parser modules.
  19. */
  20. var parsers = Object.create(null)
  21. /**
  22. * Create a middleware to parse urlencoded bodies.
  23. *
  24. * @param {object} [options]
  25. * @return {function}
  26. * @api public
  27. */
  28. function urlencoded(options){
  29. options = options || {};
  30. // notice because option default will flip in next major
  31. if (options.extended === undefined) {
  32. deprecate('urlencoded: explicitly specify "extended: true" for extended parsing')
  33. }
  34. var extended = options.extended !== false
  35. var inflate = options.inflate !== false
  36. var limit = typeof options.limit !== 'number'
  37. ? bytes(options.limit || '100kb')
  38. : options.limit
  39. var type = options.type || 'urlencoded'
  40. var verify = options.verify || false
  41. if (verify !== false && typeof verify !== 'function') {
  42. throw new TypeError('option verify must be function')
  43. }
  44. var queryparse = extended
  45. ? parser('qs')
  46. : parser('querystring')
  47. function parse(body) {
  48. return body.length
  49. ? queryparse(body)
  50. : {}
  51. }
  52. return function urlencodedParser(req, res, next) {
  53. if (req._body) return next();
  54. req.body = req.body || {}
  55. if (!typeis(req, type)) return next();
  56. var charset = typer.parse(req).parameters.charset || 'utf-8'
  57. if (charset.toLowerCase() !== 'utf-8') {
  58. var err = new Error('unsupported charset')
  59. err.status = 415
  60. next(err)
  61. return
  62. }
  63. // read
  64. read(req, res, next, parse, {
  65. encoding: charset,
  66. inflate: inflate,
  67. limit: limit,
  68. verify: verify
  69. })
  70. }
  71. }
  72. /**
  73. * Get parser for module name dynamically.
  74. *
  75. * @param {string} name
  76. * @return {function}
  77. * @api private
  78. */
  79. function parser(name) {
  80. var mod = parsers[name]
  81. if (mod) {
  82. return mod.parse
  83. }
  84. // load module
  85. mod = parsers[name] = require(name)
  86. return mod.parse
  87. }