Ein Projekt das es ermöglicht Beerpong über das Internet von zwei unabhängigen positionen aus zu spielen. Entstehung im Rahmen einer Praktikumsaufgabe im Fach Interaktion.
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.

urlencoded.js 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. /*!
  2. * body-parser
  3. * Copyright(c) 2014 Jonathan Ong
  4. * Copyright(c) 2014 Douglas Christopher Wilson
  5. * MIT Licensed
  6. */
  7. /**
  8. * Module dependencies.
  9. */
  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')
  15. /**
  16. * Module exports.
  17. */
  18. module.exports = urlencoded
  19. /**
  20. * Cache of parser modules.
  21. */
  22. var parsers = Object.create(null)
  23. /**
  24. * Create a middleware to parse urlencoded bodies.
  25. *
  26. * @param {object} [options]
  27. * @return {function}
  28. * @api public
  29. */
  30. function urlencoded(options){
  31. options = options || {};
  32. // notice because option default will flip in next major
  33. if (options.extended === undefined) {
  34. deprecate('undefined extended: provide extended option')
  35. }
  36. var extended = options.extended !== false
  37. var inflate = options.inflate !== false
  38. var limit = typeof options.limit !== 'number'
  39. ? bytes(options.limit || '100kb')
  40. : options.limit
  41. var type = options.type || 'urlencoded'
  42. var verify = options.verify || false
  43. if (verify !== false && typeof verify !== 'function') {
  44. throw new TypeError('option verify must be function')
  45. }
  46. var queryparse = extended
  47. ? extendedparser(options)
  48. : simpleparser(options)
  49. function parse(body) {
  50. return body.length
  51. ? queryparse(body)
  52. : {}
  53. }
  54. return function urlencodedParser(req, res, next) {
  55. if (req._body) return next();
  56. req.body = req.body || {}
  57. if (!typeis(req, type)) return next();
  58. var charset = typer.parse(req).parameters.charset || 'utf-8'
  59. if (charset.toLowerCase() !== 'utf-8') {
  60. var err = new Error('unsupported charset')
  61. err.status = 415
  62. next(err)
  63. return
  64. }
  65. // read
  66. read(req, res, next, parse, {
  67. encoding: charset,
  68. inflate: inflate,
  69. limit: limit,
  70. verify: verify
  71. })
  72. }
  73. }
  74. /**
  75. * Get the extended query parser.
  76. *
  77. * @param {object} options
  78. */
  79. function extendedparser(options) {
  80. var parameterLimit = options.parameterLimit !== undefined
  81. ? options.parameterLimit
  82. : 1000
  83. var parse = parser('qs')
  84. if (isNaN(parameterLimit) || parameterLimit < 1) {
  85. throw new TypeError('option parameterLimit must be a positive number')
  86. }
  87. if (isFinite(parameterLimit)) {
  88. parameterLimit = parameterLimit | 0
  89. }
  90. var opts = {
  91. arrayLimit: 100,
  92. parameterLimit: parameterLimit
  93. }
  94. return function queryparse(body) {
  95. if (overlimit(body, parameterLimit)) {
  96. var err = new Error('too many parameters')
  97. err.status = 413
  98. throw err
  99. }
  100. return parse(body, opts)
  101. }
  102. }
  103. /**
  104. * Determine if the parameter count is over the limit.
  105. *
  106. * @param {string} body
  107. * @param {number} limit
  108. * @api private
  109. */
  110. function overlimit(body, limit) {
  111. if (limit === Infinity) {
  112. return false
  113. }
  114. var count = 0
  115. var index = 0
  116. while ((index = body.indexOf('&', index)) !== -1) {
  117. count++
  118. index++
  119. if (count === limit) {
  120. return true
  121. }
  122. }
  123. return false
  124. }
  125. /**
  126. * Get parser for module name dynamically.
  127. *
  128. * @param {string} name
  129. * @return {function}
  130. * @api private
  131. */
  132. function parser(name) {
  133. var mod = parsers[name]
  134. if (mod) {
  135. return mod.parse
  136. }
  137. // load module
  138. mod = parsers[name] = require(name)
  139. return mod.parse
  140. }
  141. /**
  142. * Get the simple query parser.
  143. *
  144. * @param {object} options
  145. */
  146. function simpleparser(options) {
  147. var parameterLimit = options.parameterLimit !== undefined
  148. ? options.parameterLimit
  149. : 1000
  150. var parse = parser('querystring')
  151. if (isNaN(parameterLimit) || parameterLimit < 1) {
  152. throw new TypeError('option parameterLimit must be a positive number')
  153. }
  154. if (isFinite(parameterLimit)) {
  155. parameterLimit = parameterLimit | 0
  156. }
  157. return function queryparse(body) {
  158. if (overlimit(body, parameterLimit)) {
  159. var err = new Error('too many parameters')
  160. err.status = 413
  161. throw err
  162. }
  163. return parse(body, undefined, undefined, {maxKeys: parameterLimit})
  164. }
  165. }