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.

text.js 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. /*!
  2. * body-parser
  3. * Copyright(c) 2014-2015 Douglas Christopher Wilson
  4. * MIT Licensed
  5. */
  6. 'use strict'
  7. /**
  8. * Module dependencies.
  9. */
  10. var bytes = require('bytes')
  11. var contentType = require('content-type')
  12. var debug = require('debug')('body-parser:text')
  13. var read = require('../read')
  14. var typeis = require('type-is')
  15. /**
  16. * Module exports.
  17. */
  18. module.exports = text
  19. /**
  20. * Create a middleware to parse text bodies.
  21. *
  22. * @param {object} [options]
  23. * @return {function}
  24. * @api public
  25. */
  26. function text (options) {
  27. var opts = options || {}
  28. var defaultCharset = opts.defaultCharset || 'utf-8'
  29. var inflate = opts.inflate !== false
  30. var limit = typeof opts.limit !== 'number'
  31. ? bytes.parse(opts.limit || '100kb')
  32. : opts.limit
  33. var type = opts.type || 'text/plain'
  34. var verify = opts.verify || false
  35. if (verify !== false && typeof verify !== 'function') {
  36. throw new TypeError('option verify must be function')
  37. }
  38. // create the appropriate type checking function
  39. var shouldParse = typeof type !== 'function'
  40. ? typeChecker(type)
  41. : type
  42. function parse (buf) {
  43. return buf
  44. }
  45. return function textParser (req, res, next) {
  46. if (req._body) {
  47. debug('body already parsed')
  48. next()
  49. return
  50. }
  51. req.body = req.body || {}
  52. // skip requests without bodies
  53. if (!typeis.hasBody(req)) {
  54. debug('skip empty body')
  55. next()
  56. return
  57. }
  58. debug('content-type %j', req.headers['content-type'])
  59. // determine if request should be parsed
  60. if (!shouldParse(req)) {
  61. debug('skip parsing')
  62. next()
  63. return
  64. }
  65. // get charset
  66. var charset = getCharset(req) || defaultCharset
  67. // read
  68. read(req, res, next, parse, debug, {
  69. encoding: charset,
  70. inflate: inflate,
  71. limit: limit,
  72. verify: verify
  73. })
  74. }
  75. }
  76. /**
  77. * Get the charset of a request.
  78. *
  79. * @param {object} req
  80. * @api private
  81. */
  82. function getCharset (req) {
  83. try {
  84. return (contentType.parse(req).parameters.charset || '').toLowerCase()
  85. } catch (e) {
  86. return undefined
  87. }
  88. }
  89. /**
  90. * Get the simple type checker.
  91. *
  92. * @param {string} type
  93. * @return {function}
  94. */
  95. function typeChecker (type) {
  96. return function checkType (req) {
  97. return Boolean(typeis(req, type))
  98. }
  99. }