crabatool 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (625) hide show
  1. package/index.js +23 -2
  2. package/ngp/config.js +2 -2
  3. package/ngp/node_modules/.bin/mime +12 -0
  4. package/ngp/node_modules/.bin/mime.cmd +17 -0
  5. package/ngp/node_modules/.bin/mime.ps1 +28 -0
  6. package/ngp/node_modules/.bin/uglifyjs +12 -0
  7. package/ngp/node_modules/.bin/uglifyjs.cmd +17 -0
  8. package/ngp/node_modules/.bin/uglifyjs.ps1 +28 -0
  9. package/ngp/node_modules/.package-lock.json +863 -0
  10. package/ngp/node_modules/accepts/HISTORY.md +243 -0
  11. package/ngp/node_modules/accepts/LICENSE +23 -0
  12. package/ngp/node_modules/accepts/README.md +140 -0
  13. package/ngp/node_modules/accepts/index.js +238 -0
  14. package/ngp/node_modules/accepts/package.json +47 -0
  15. package/ngp/node_modules/anymatch/LICENSE +15 -0
  16. package/ngp/node_modules/anymatch/README.md +87 -0
  17. package/ngp/node_modules/anymatch/index.d.ts +19 -0
  18. package/ngp/node_modules/anymatch/index.js +104 -0
  19. package/ngp/node_modules/anymatch/package.json +48 -0
  20. package/ngp/node_modules/array-flatten/LICENSE +21 -0
  21. package/ngp/node_modules/array-flatten/README.md +43 -0
  22. package/ngp/node_modules/array-flatten/array-flatten.js +64 -0
  23. package/ngp/node_modules/array-flatten/package.json +39 -0
  24. package/ngp/node_modules/binary-extensions/binary-extensions.json +260 -0
  25. package/ngp/node_modules/binary-extensions/binary-extensions.json.d.ts +3 -0
  26. package/ngp/node_modules/binary-extensions/index.d.ts +14 -0
  27. package/ngp/node_modules/binary-extensions/index.js +1 -0
  28. package/ngp/node_modules/binary-extensions/license +9 -0
  29. package/ngp/node_modules/binary-extensions/package.json +38 -0
  30. package/ngp/node_modules/binary-extensions/readme.md +41 -0
  31. package/ngp/node_modules/body-parser/HISTORY.md +651 -0
  32. package/ngp/node_modules/body-parser/LICENSE +23 -0
  33. package/ngp/node_modules/body-parser/README.md +464 -0
  34. package/ngp/node_modules/body-parser/SECURITY.md +25 -0
  35. package/ngp/node_modules/body-parser/index.js +157 -0
  36. package/ngp/node_modules/body-parser/lib/read.js +205 -0
  37. package/ngp/node_modules/body-parser/lib/types/json.js +236 -0
  38. package/ngp/node_modules/body-parser/lib/types/raw.js +101 -0
  39. package/ngp/node_modules/body-parser/lib/types/text.js +121 -0
  40. package/ngp/node_modules/body-parser/lib/types/urlencoded.js +284 -0
  41. package/ngp/node_modules/body-parser/node_modules/bytes/History.md +97 -0
  42. package/ngp/node_modules/body-parser/node_modules/bytes/LICENSE +23 -0
  43. package/ngp/node_modules/body-parser/node_modules/bytes/Readme.md +152 -0
  44. package/ngp/node_modules/body-parser/node_modules/bytes/index.js +170 -0
  45. package/ngp/node_modules/body-parser/node_modules/bytes/package.json +42 -0
  46. package/ngp/node_modules/body-parser/node_modules/iconv-lite/Changelog.md +162 -0
  47. package/ngp/node_modules/body-parser/node_modules/iconv-lite/LICENSE +21 -0
  48. package/ngp/node_modules/body-parser/node_modules/iconv-lite/README.md +156 -0
  49. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  50. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  51. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/index.js +22 -0
  52. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/internal.js +188 -0
  53. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  54. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  55. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  56. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  57. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  58. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  59. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  60. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  61. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  62. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  63. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  64. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/utf16.js +177 -0
  65. package/ngp/node_modules/body-parser/node_modules/iconv-lite/encodings/utf7.js +290 -0
  66. package/ngp/node_modules/body-parser/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  67. package/ngp/node_modules/body-parser/node_modules/iconv-lite/lib/extend-node.js +217 -0
  68. package/ngp/node_modules/body-parser/node_modules/iconv-lite/lib/index.d.ts +24 -0
  69. package/ngp/node_modules/body-parser/node_modules/iconv-lite/lib/index.js +153 -0
  70. package/ngp/node_modules/body-parser/node_modules/iconv-lite/lib/streams.js +121 -0
  71. package/ngp/node_modules/body-parser/node_modules/iconv-lite/package.json +46 -0
  72. package/ngp/node_modules/body-parser/package.json +56 -0
  73. package/ngp/node_modules/braces/CHANGELOG.md +184 -0
  74. package/ngp/node_modules/braces/LICENSE +21 -0
  75. package/ngp/node_modules/braces/README.md +593 -0
  76. package/ngp/node_modules/braces/index.js +170 -0
  77. package/ngp/node_modules/braces/lib/compile.js +57 -0
  78. package/ngp/node_modules/braces/lib/constants.js +57 -0
  79. package/ngp/node_modules/braces/lib/expand.js +113 -0
  80. package/ngp/node_modules/braces/lib/parse.js +333 -0
  81. package/ngp/node_modules/braces/lib/stringify.js +32 -0
  82. package/ngp/node_modules/braces/lib/utils.js +112 -0
  83. package/ngp/node_modules/braces/package.json +77 -0
  84. package/ngp/node_modules/bytes/History.md +82 -0
  85. package/ngp/node_modules/bytes/LICENSE +23 -0
  86. package/ngp/node_modules/bytes/Readme.md +125 -0
  87. package/ngp/node_modules/bytes/index.js +159 -0
  88. package/ngp/node_modules/bytes/package.json +39 -0
  89. package/ngp/node_modules/call-bind/.eslintignore +1 -0
  90. package/ngp/node_modules/call-bind/.eslintrc +17 -0
  91. package/ngp/node_modules/call-bind/.github/FUNDING.yml +12 -0
  92. package/ngp/node_modules/call-bind/.nycrc +13 -0
  93. package/ngp/node_modules/call-bind/CHANGELOG.md +42 -0
  94. package/ngp/node_modules/call-bind/LICENSE +21 -0
  95. package/ngp/node_modules/call-bind/README.md +2 -0
  96. package/ngp/node_modules/call-bind/callBound.js +15 -0
  97. package/ngp/node_modules/call-bind/index.js +47 -0
  98. package/ngp/node_modules/call-bind/package.json +80 -0
  99. package/ngp/node_modules/call-bind/test/callBound.js +55 -0
  100. package/ngp/node_modules/call-bind/test/index.js +66 -0
  101. package/ngp/node_modules/chokidar/LICENSE +21 -0
  102. package/ngp/node_modules/chokidar/README.md +308 -0
  103. package/ngp/node_modules/chokidar/index.js +973 -0
  104. package/ngp/node_modules/chokidar/lib/constants.js +65 -0
  105. package/ngp/node_modules/chokidar/lib/fsevents-handler.js +524 -0
  106. package/ngp/node_modules/chokidar/lib/nodefs-handler.js +654 -0
  107. package/ngp/node_modules/chokidar/package.json +85 -0
  108. package/ngp/node_modules/chokidar/types/index.d.ts +188 -0
  109. package/ngp/node_modules/compressible/HISTORY.md +111 -0
  110. package/ngp/node_modules/compressible/LICENSE +24 -0
  111. package/ngp/node_modules/compressible/README.md +61 -0
  112. package/ngp/node_modules/compressible/index.js +58 -0
  113. package/ngp/node_modules/compressible/package.json +48 -0
  114. package/ngp/node_modules/compression/HISTORY.md +307 -0
  115. package/ngp/node_modules/compression/LICENSE +23 -0
  116. package/ngp/node_modules/compression/README.md +240 -0
  117. package/ngp/node_modules/compression/index.js +288 -0
  118. package/ngp/node_modules/compression/package.json +47 -0
  119. package/ngp/node_modules/content-disposition/HISTORY.md +60 -0
  120. package/ngp/node_modules/content-disposition/LICENSE +22 -0
  121. package/ngp/node_modules/content-disposition/README.md +142 -0
  122. package/ngp/node_modules/content-disposition/index.js +458 -0
  123. package/ngp/node_modules/content-disposition/node_modules/safe-buffer/LICENSE +21 -0
  124. package/ngp/node_modules/content-disposition/node_modules/safe-buffer/README.md +584 -0
  125. package/ngp/node_modules/content-disposition/node_modules/safe-buffer/index.d.ts +187 -0
  126. package/ngp/node_modules/content-disposition/node_modules/safe-buffer/index.js +65 -0
  127. package/ngp/node_modules/content-disposition/node_modules/safe-buffer/package.json +51 -0
  128. package/ngp/node_modules/content-disposition/package.json +44 -0
  129. package/ngp/node_modules/content-type/HISTORY.md +24 -0
  130. package/ngp/node_modules/content-type/LICENSE +22 -0
  131. package/ngp/node_modules/content-type/README.md +92 -0
  132. package/ngp/node_modules/content-type/index.js +222 -0
  133. package/ngp/node_modules/content-type/package.json +40 -0
  134. package/ngp/node_modules/cookie/HISTORY.md +142 -0
  135. package/ngp/node_modules/cookie/LICENSE +24 -0
  136. package/ngp/node_modules/cookie/README.md +302 -0
  137. package/ngp/node_modules/cookie/SECURITY.md +25 -0
  138. package/ngp/node_modules/cookie/index.js +270 -0
  139. package/ngp/node_modules/cookie/package.json +44 -0
  140. package/ngp/node_modules/cookie-signature/History.md +38 -0
  141. package/ngp/node_modules/cookie-signature/Readme.md +42 -0
  142. package/ngp/node_modules/cookie-signature/index.js +51 -0
  143. package/ngp/node_modules/cookie-signature/package.json +18 -0
  144. package/ngp/node_modules/crabatool/index.js +28 -0
  145. package/ngp/node_modules/crabatool/ngp/config.js +25 -0
  146. package/ngp/node_modules/crabatool/ngp/ngp.js +3 -0
  147. package/ngp/node_modules/crabatool/ngp/package.json +15 -0
  148. package/ngp/node_modules/crabatool/ngp/readme.md +4 -0
  149. package/ngp/node_modules/crabatool/package.json +25 -0
  150. package/ngp/node_modules/crabatool/readme.md +12 -0
  151. package/ngp/node_modules/crabatool/server.js +124 -0
  152. package/ngp/node_modules/debug/.coveralls.yml +1 -0
  153. package/ngp/node_modules/debug/.eslintrc +11 -0
  154. package/ngp/node_modules/debug/.travis.yml +14 -0
  155. package/ngp/node_modules/debug/CHANGELOG.md +362 -0
  156. package/ngp/node_modules/debug/LICENSE +19 -0
  157. package/ngp/node_modules/debug/Makefile +50 -0
  158. package/ngp/node_modules/debug/README.md +312 -0
  159. package/ngp/node_modules/debug/component.json +19 -0
  160. package/ngp/node_modules/debug/karma.conf.js +70 -0
  161. package/ngp/node_modules/debug/node.js +1 -0
  162. package/ngp/node_modules/debug/package.json +49 -0
  163. package/ngp/node_modules/debug/src/browser.js +185 -0
  164. package/ngp/node_modules/debug/src/debug.js +202 -0
  165. package/ngp/node_modules/debug/src/index.js +10 -0
  166. package/ngp/node_modules/debug/src/inspector-log.js +15 -0
  167. package/ngp/node_modules/debug/src/node.js +248 -0
  168. package/ngp/node_modules/depd/History.md +103 -0
  169. package/ngp/node_modules/depd/LICENSE +22 -0
  170. package/ngp/node_modules/depd/Readme.md +280 -0
  171. package/ngp/node_modules/depd/index.js +538 -0
  172. package/ngp/node_modules/depd/lib/browser/index.js +77 -0
  173. package/ngp/node_modules/depd/package.json +45 -0
  174. package/ngp/node_modules/destroy/LICENSE +23 -0
  175. package/ngp/node_modules/destroy/README.md +63 -0
  176. package/ngp/node_modules/destroy/index.js +209 -0
  177. package/ngp/node_modules/destroy/package.json +48 -0
  178. package/ngp/node_modules/ee-first/LICENSE +22 -0
  179. package/ngp/node_modules/ee-first/README.md +80 -0
  180. package/ngp/node_modules/ee-first/index.js +95 -0
  181. package/ngp/node_modules/ee-first/package.json +29 -0
  182. package/ngp/node_modules/encodeurl/HISTORY.md +14 -0
  183. package/ngp/node_modules/encodeurl/LICENSE +22 -0
  184. package/ngp/node_modules/encodeurl/README.md +128 -0
  185. package/ngp/node_modules/encodeurl/index.js +60 -0
  186. package/ngp/node_modules/encodeurl/package.json +40 -0
  187. package/ngp/node_modules/escape-html/LICENSE +24 -0
  188. package/ngp/node_modules/escape-html/Readme.md +43 -0
  189. package/ngp/node_modules/escape-html/index.js +78 -0
  190. package/ngp/node_modules/escape-html/package.json +24 -0
  191. package/ngp/node_modules/etag/HISTORY.md +83 -0
  192. package/ngp/node_modules/etag/LICENSE +22 -0
  193. package/ngp/node_modules/etag/README.md +159 -0
  194. package/ngp/node_modules/etag/index.js +131 -0
  195. package/ngp/node_modules/etag/package.json +47 -0
  196. package/ngp/node_modules/express/History.md +3579 -0
  197. package/ngp/node_modules/express/LICENSE +24 -0
  198. package/ngp/node_modules/express/Readme.md +166 -0
  199. package/ngp/node_modules/express/index.js +11 -0
  200. package/ngp/node_modules/express/lib/application.js +661 -0
  201. package/ngp/node_modules/express/lib/express.js +116 -0
  202. package/ngp/node_modules/express/lib/middleware/init.js +43 -0
  203. package/ngp/node_modules/express/lib/middleware/query.js +47 -0
  204. package/ngp/node_modules/express/lib/request.js +525 -0
  205. package/ngp/node_modules/express/lib/response.js +1169 -0
  206. package/ngp/node_modules/express/lib/router/index.js +673 -0
  207. package/ngp/node_modules/express/lib/router/layer.js +181 -0
  208. package/ngp/node_modules/express/lib/router/route.js +225 -0
  209. package/ngp/node_modules/express/lib/utils.js +304 -0
  210. package/ngp/node_modules/express/lib/view.js +182 -0
  211. package/ngp/node_modules/express/node_modules/safe-buffer/LICENSE +21 -0
  212. package/ngp/node_modules/express/node_modules/safe-buffer/README.md +584 -0
  213. package/ngp/node_modules/express/node_modules/safe-buffer/index.d.ts +187 -0
  214. package/ngp/node_modules/express/node_modules/safe-buffer/index.js +65 -0
  215. package/ngp/node_modules/express/node_modules/safe-buffer/package.json +51 -0
  216. package/ngp/node_modules/express/package.json +99 -0
  217. package/ngp/node_modules/fill-range/LICENSE +21 -0
  218. package/ngp/node_modules/fill-range/README.md +237 -0
  219. package/ngp/node_modules/fill-range/index.js +249 -0
  220. package/ngp/node_modules/fill-range/package.json +69 -0
  221. package/ngp/node_modules/finalhandler/HISTORY.md +195 -0
  222. package/ngp/node_modules/finalhandler/LICENSE +22 -0
  223. package/ngp/node_modules/finalhandler/README.md +147 -0
  224. package/ngp/node_modules/finalhandler/SECURITY.md +25 -0
  225. package/ngp/node_modules/finalhandler/index.js +336 -0
  226. package/ngp/node_modules/finalhandler/package.json +46 -0
  227. package/ngp/node_modules/forwarded/HISTORY.md +21 -0
  228. package/ngp/node_modules/forwarded/LICENSE +22 -0
  229. package/ngp/node_modules/forwarded/README.md +57 -0
  230. package/ngp/node_modules/forwarded/index.js +90 -0
  231. package/ngp/node_modules/forwarded/package.json +45 -0
  232. package/ngp/node_modules/fresh/HISTORY.md +70 -0
  233. package/ngp/node_modules/fresh/LICENSE +23 -0
  234. package/ngp/node_modules/fresh/README.md +119 -0
  235. package/ngp/node_modules/fresh/index.js +137 -0
  236. package/ngp/node_modules/fresh/package.json +46 -0
  237. package/ngp/node_modules/function-bind/.editorconfig +20 -0
  238. package/ngp/node_modules/function-bind/.eslintrc +15 -0
  239. package/ngp/node_modules/function-bind/.jscs.json +176 -0
  240. package/ngp/node_modules/function-bind/.travis.yml +168 -0
  241. package/ngp/node_modules/function-bind/LICENSE +20 -0
  242. package/ngp/node_modules/function-bind/README.md +48 -0
  243. package/ngp/node_modules/function-bind/implementation.js +52 -0
  244. package/ngp/node_modules/function-bind/index.js +5 -0
  245. package/ngp/node_modules/function-bind/package.json +63 -0
  246. package/ngp/node_modules/function-bind/test/.eslintrc +9 -0
  247. package/ngp/node_modules/function-bind/test/index.js +252 -0
  248. package/ngp/node_modules/get-intrinsic/.eslintignore +1 -0
  249. package/ngp/node_modules/get-intrinsic/.eslintrc +43 -0
  250. package/ngp/node_modules/get-intrinsic/.github/FUNDING.yml +12 -0
  251. package/ngp/node_modules/get-intrinsic/.nycrc +13 -0
  252. package/ngp/node_modules/get-intrinsic/CHANGELOG.md +64 -0
  253. package/ngp/node_modules/get-intrinsic/LICENSE +21 -0
  254. package/ngp/node_modules/get-intrinsic/README.md +65 -0
  255. package/ngp/node_modules/get-intrinsic/index.js +330 -0
  256. package/ngp/node_modules/get-intrinsic/package.json +78 -0
  257. package/ngp/node_modules/get-intrinsic/test/GetIntrinsic.js +260 -0
  258. package/ngp/node_modules/glob-parent/CHANGELOG.md +110 -0
  259. package/ngp/node_modules/glob-parent/LICENSE +15 -0
  260. package/ngp/node_modules/glob-parent/README.md +137 -0
  261. package/ngp/node_modules/glob-parent/index.js +42 -0
  262. package/ngp/node_modules/glob-parent/package.json +48 -0
  263. package/ngp/node_modules/has/LICENSE-MIT +22 -0
  264. package/ngp/node_modules/has/README.md +18 -0
  265. package/ngp/node_modules/has/package.json +48 -0
  266. package/ngp/node_modules/has/src/index.js +5 -0
  267. package/ngp/node_modules/has/test/index.js +10 -0
  268. package/ngp/node_modules/has-symbols/.eslintrc +11 -0
  269. package/ngp/node_modules/has-symbols/.github/FUNDING.yml +12 -0
  270. package/ngp/node_modules/has-symbols/.nycrc +9 -0
  271. package/ngp/node_modules/has-symbols/CHANGELOG.md +75 -0
  272. package/ngp/node_modules/has-symbols/LICENSE +21 -0
  273. package/ngp/node_modules/has-symbols/README.md +46 -0
  274. package/ngp/node_modules/has-symbols/index.js +13 -0
  275. package/ngp/node_modules/has-symbols/package.json +101 -0
  276. package/ngp/node_modules/has-symbols/shams.js +42 -0
  277. package/ngp/node_modules/has-symbols/test/index.js +22 -0
  278. package/ngp/node_modules/has-symbols/test/shams/core-js.js +28 -0
  279. package/ngp/node_modules/has-symbols/test/shams/get-own-property-symbols.js +28 -0
  280. package/ngp/node_modules/has-symbols/test/tests.js +56 -0
  281. package/ngp/node_modules/http-errors/HISTORY.md +180 -0
  282. package/ngp/node_modules/http-errors/LICENSE +23 -0
  283. package/ngp/node_modules/http-errors/README.md +169 -0
  284. package/ngp/node_modules/http-errors/index.js +289 -0
  285. package/ngp/node_modules/http-errors/package.json +50 -0
  286. package/ngp/node_modules/iconv-lite/Changelog.md +184 -0
  287. package/ngp/node_modules/iconv-lite/LICENSE +21 -0
  288. package/ngp/node_modules/iconv-lite/README.md +166 -0
  289. package/ngp/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  290. package/ngp/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  291. package/ngp/node_modules/iconv-lite/encodings/index.js +23 -0
  292. package/ngp/node_modules/iconv-lite/encodings/internal.js +188 -0
  293. package/ngp/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  294. package/ngp/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  295. package/ngp/node_modules/iconv-lite/encodings/sbcs-data.js +179 -0
  296. package/ngp/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  297. package/ngp/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  298. package/ngp/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  299. package/ngp/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  300. package/ngp/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  301. package/ngp/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  302. package/ngp/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  303. package/ngp/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  304. package/ngp/node_modules/iconv-lite/encodings/utf16.js +177 -0
  305. package/ngp/node_modules/iconv-lite/encodings/utf32.js +281 -0
  306. package/ngp/node_modules/iconv-lite/encodings/utf7.js +290 -0
  307. package/ngp/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  308. package/ngp/node_modules/iconv-lite/lib/extend-node.js +217 -0
  309. package/ngp/node_modules/iconv-lite/lib/index.d.ts +41 -0
  310. package/ngp/node_modules/iconv-lite/lib/index.js +153 -0
  311. package/ngp/node_modules/iconv-lite/lib/streams.js +121 -0
  312. package/ngp/node_modules/iconv-lite/package.json +45 -0
  313. package/ngp/node_modules/inherits/LICENSE +16 -0
  314. package/ngp/node_modules/inherits/README.md +42 -0
  315. package/ngp/node_modules/inherits/inherits.js +9 -0
  316. package/ngp/node_modules/inherits/inherits_browser.js +27 -0
  317. package/ngp/node_modules/inherits/package.json +29 -0
  318. package/ngp/node_modules/ipaddr.js/LICENSE +19 -0
  319. package/ngp/node_modules/ipaddr.js/README.md +233 -0
  320. package/ngp/node_modules/ipaddr.js/ipaddr.min.js +1 -0
  321. package/ngp/node_modules/ipaddr.js/lib/ipaddr.js +673 -0
  322. package/ngp/node_modules/ipaddr.js/lib/ipaddr.js.d.ts +68 -0
  323. package/ngp/node_modules/ipaddr.js/package.json +35 -0
  324. package/ngp/node_modules/is-binary-path/index.d.ts +17 -0
  325. package/ngp/node_modules/is-binary-path/index.js +7 -0
  326. package/ngp/node_modules/is-binary-path/license +9 -0
  327. package/ngp/node_modules/is-binary-path/package.json +40 -0
  328. package/ngp/node_modules/is-binary-path/readme.md +34 -0
  329. package/ngp/node_modules/is-extglob/LICENSE +21 -0
  330. package/ngp/node_modules/is-extglob/README.md +107 -0
  331. package/ngp/node_modules/is-extglob/index.js +20 -0
  332. package/ngp/node_modules/is-extglob/package.json +69 -0
  333. package/ngp/node_modules/is-glob/LICENSE +21 -0
  334. package/ngp/node_modules/is-glob/README.md +206 -0
  335. package/ngp/node_modules/is-glob/index.js +150 -0
  336. package/ngp/node_modules/is-glob/package.json +81 -0
  337. package/ngp/node_modules/is-number/LICENSE +21 -0
  338. package/ngp/node_modules/is-number/README.md +187 -0
  339. package/ngp/node_modules/is-number/index.js +18 -0
  340. package/ngp/node_modules/is-number/package.json +82 -0
  341. package/ngp/node_modules/media-typer/HISTORY.md +22 -0
  342. package/ngp/node_modules/media-typer/LICENSE +22 -0
  343. package/ngp/node_modules/media-typer/README.md +81 -0
  344. package/ngp/node_modules/media-typer/index.js +270 -0
  345. package/ngp/node_modules/media-typer/package.json +26 -0
  346. package/ngp/node_modules/merge-descriptors/HISTORY.md +21 -0
  347. package/ngp/node_modules/merge-descriptors/LICENSE +23 -0
  348. package/ngp/node_modules/merge-descriptors/README.md +48 -0
  349. package/ngp/node_modules/merge-descriptors/index.js +60 -0
  350. package/ngp/node_modules/merge-descriptors/package.json +32 -0
  351. package/ngp/node_modules/methods/HISTORY.md +29 -0
  352. package/ngp/node_modules/methods/LICENSE +24 -0
  353. package/ngp/node_modules/methods/README.md +51 -0
  354. package/ngp/node_modules/methods/index.js +69 -0
  355. package/ngp/node_modules/methods/package.json +36 -0
  356. package/ngp/node_modules/mime/CHANGELOG.md +164 -0
  357. package/ngp/node_modules/mime/LICENSE +21 -0
  358. package/ngp/node_modules/mime/README.md +90 -0
  359. package/ngp/node_modules/mime/cli.js +8 -0
  360. package/ngp/node_modules/mime/mime.js +108 -0
  361. package/ngp/node_modules/mime/package.json +44 -0
  362. package/ngp/node_modules/mime/src/build.js +53 -0
  363. package/ngp/node_modules/mime/src/test.js +60 -0
  364. package/ngp/node_modules/mime/types.json +1 -0
  365. package/ngp/node_modules/mime-db/HISTORY.md +507 -0
  366. package/ngp/node_modules/mime-db/LICENSE +23 -0
  367. package/ngp/node_modules/mime-db/README.md +100 -0
  368. package/ngp/node_modules/mime-db/db.json +8519 -0
  369. package/ngp/node_modules/mime-db/index.js +12 -0
  370. package/ngp/node_modules/mime-db/package.json +60 -0
  371. package/ngp/node_modules/mime-types/HISTORY.md +397 -0
  372. package/ngp/node_modules/mime-types/LICENSE +23 -0
  373. package/ngp/node_modules/mime-types/README.md +113 -0
  374. package/ngp/node_modules/mime-types/index.js +188 -0
  375. package/ngp/node_modules/mime-types/package.json +44 -0
  376. package/ngp/node_modules/ms/index.js +152 -0
  377. package/ngp/node_modules/ms/license.md +21 -0
  378. package/ngp/node_modules/ms/package.json +37 -0
  379. package/ngp/node_modules/ms/readme.md +51 -0
  380. package/ngp/node_modules/negotiator/HISTORY.md +108 -0
  381. package/ngp/node_modules/negotiator/LICENSE +24 -0
  382. package/ngp/node_modules/negotiator/README.md +203 -0
  383. package/ngp/node_modules/negotiator/index.js +82 -0
  384. package/ngp/node_modules/negotiator/lib/charset.js +169 -0
  385. package/ngp/node_modules/negotiator/lib/encoding.js +184 -0
  386. package/ngp/node_modules/negotiator/lib/language.js +179 -0
  387. package/ngp/node_modules/negotiator/lib/mediaType.js +294 -0
  388. package/ngp/node_modules/negotiator/package.json +42 -0
  389. package/ngp/node_modules/normalize-path/LICENSE +21 -0
  390. package/ngp/node_modules/normalize-path/README.md +127 -0
  391. package/ngp/node_modules/normalize-path/index.js +35 -0
  392. package/ngp/node_modules/normalize-path/package.json +77 -0
  393. package/ngp/node_modules/object-inspect/.eslintrc +53 -0
  394. package/ngp/node_modules/object-inspect/.github/FUNDING.yml +12 -0
  395. package/ngp/node_modules/object-inspect/.nycrc +13 -0
  396. package/ngp/node_modules/object-inspect/CHANGELOG.md +360 -0
  397. package/ngp/node_modules/object-inspect/LICENSE +21 -0
  398. package/ngp/node_modules/object-inspect/example/all.js +23 -0
  399. package/ngp/node_modules/object-inspect/example/circular.js +6 -0
  400. package/ngp/node_modules/object-inspect/example/fn.js +5 -0
  401. package/ngp/node_modules/object-inspect/example/inspect.js +10 -0
  402. package/ngp/node_modules/object-inspect/index.js +512 -0
  403. package/ngp/node_modules/object-inspect/package-support.json +20 -0
  404. package/ngp/node_modules/object-inspect/package.json +94 -0
  405. package/ngp/node_modules/object-inspect/readme.markdown +86 -0
  406. package/ngp/node_modules/object-inspect/test/bigint.js +58 -0
  407. package/ngp/node_modules/object-inspect/test/browser/dom.js +15 -0
  408. package/ngp/node_modules/object-inspect/test/circular.js +16 -0
  409. package/ngp/node_modules/object-inspect/test/deep.js +12 -0
  410. package/ngp/node_modules/object-inspect/test/element.js +53 -0
  411. package/ngp/node_modules/object-inspect/test/err.js +48 -0
  412. package/ngp/node_modules/object-inspect/test/fakes.js +29 -0
  413. package/ngp/node_modules/object-inspect/test/fn.js +76 -0
  414. package/ngp/node_modules/object-inspect/test/has.js +15 -0
  415. package/ngp/node_modules/object-inspect/test/holes.js +15 -0
  416. package/ngp/node_modules/object-inspect/test/indent-option.js +271 -0
  417. package/ngp/node_modules/object-inspect/test/inspect.js +139 -0
  418. package/ngp/node_modules/object-inspect/test/lowbyte.js +12 -0
  419. package/ngp/node_modules/object-inspect/test/number.js +58 -0
  420. package/ngp/node_modules/object-inspect/test/quoteStyle.js +17 -0
  421. package/ngp/node_modules/object-inspect/test/toStringTag.js +40 -0
  422. package/ngp/node_modules/object-inspect/test/undef.js +12 -0
  423. package/ngp/node_modules/object-inspect/test/values.js +211 -0
  424. package/ngp/node_modules/object-inspect/test-core-js.js +26 -0
  425. package/ngp/node_modules/object-inspect/util.inspect.js +1 -0
  426. package/ngp/node_modules/on-finished/HISTORY.md +98 -0
  427. package/ngp/node_modules/on-finished/LICENSE +23 -0
  428. package/ngp/node_modules/on-finished/README.md +162 -0
  429. package/ngp/node_modules/on-finished/index.js +234 -0
  430. package/ngp/node_modules/on-finished/package.json +39 -0
  431. package/ngp/node_modules/on-headers/HISTORY.md +21 -0
  432. package/ngp/node_modules/on-headers/LICENSE +22 -0
  433. package/ngp/node_modules/on-headers/README.md +81 -0
  434. package/ngp/node_modules/on-headers/index.js +132 -0
  435. package/ngp/node_modules/on-headers/package.json +42 -0
  436. package/ngp/node_modules/parseurl/HISTORY.md +58 -0
  437. package/ngp/node_modules/parseurl/LICENSE +24 -0
  438. package/ngp/node_modules/parseurl/README.md +133 -0
  439. package/ngp/node_modules/parseurl/index.js +158 -0
  440. package/ngp/node_modules/parseurl/package.json +40 -0
  441. package/ngp/node_modules/path-to-regexp/History.md +36 -0
  442. package/ngp/node_modules/path-to-regexp/LICENSE +21 -0
  443. package/ngp/node_modules/path-to-regexp/Readme.md +35 -0
  444. package/ngp/node_modules/path-to-regexp/index.js +129 -0
  445. package/ngp/node_modules/path-to-regexp/package.json +30 -0
  446. package/ngp/node_modules/picomatch/CHANGELOG.md +136 -0
  447. package/ngp/node_modules/picomatch/LICENSE +21 -0
  448. package/ngp/node_modules/picomatch/README.md +708 -0
  449. package/ngp/node_modules/picomatch/index.js +3 -0
  450. package/ngp/node_modules/picomatch/lib/constants.js +179 -0
  451. package/ngp/node_modules/picomatch/lib/parse.js +1091 -0
  452. package/ngp/node_modules/picomatch/lib/picomatch.js +342 -0
  453. package/ngp/node_modules/picomatch/lib/scan.js +391 -0
  454. package/ngp/node_modules/picomatch/lib/utils.js +64 -0
  455. package/ngp/node_modules/picomatch/package.json +81 -0
  456. package/ngp/node_modules/proxy-addr/HISTORY.md +161 -0
  457. package/ngp/node_modules/proxy-addr/LICENSE +22 -0
  458. package/ngp/node_modules/proxy-addr/README.md +139 -0
  459. package/ngp/node_modules/proxy-addr/index.js +327 -0
  460. package/ngp/node_modules/proxy-addr/package.json +47 -0
  461. package/ngp/node_modules/qs/.editorconfig +40 -0
  462. package/ngp/node_modules/qs/.eslintrc +38 -0
  463. package/ngp/node_modules/qs/.github/FUNDING.yml +12 -0
  464. package/ngp/node_modules/qs/.nycrc +13 -0
  465. package/ngp/node_modules/qs/CHANGELOG.md +388 -0
  466. package/ngp/node_modules/qs/LICENSE.md +29 -0
  467. package/ngp/node_modules/qs/README.md +623 -0
  468. package/ngp/node_modules/qs/dist/qs.js +2044 -0
  469. package/ngp/node_modules/qs/lib/formats.js +23 -0
  470. package/ngp/node_modules/qs/lib/index.js +11 -0
  471. package/ngp/node_modules/qs/lib/parse.js +263 -0
  472. package/ngp/node_modules/qs/lib/stringify.js +317 -0
  473. package/ngp/node_modules/qs/lib/utils.js +252 -0
  474. package/ngp/node_modules/qs/package.json +73 -0
  475. package/ngp/node_modules/qs/test/parse.js +841 -0
  476. package/ngp/node_modules/qs/test/stringify.js +865 -0
  477. package/ngp/node_modules/qs/test/utils.js +136 -0
  478. package/ngp/node_modules/range-parser/HISTORY.md +56 -0
  479. package/ngp/node_modules/range-parser/LICENSE +23 -0
  480. package/ngp/node_modules/range-parser/README.md +84 -0
  481. package/ngp/node_modules/range-parser/index.js +162 -0
  482. package/ngp/node_modules/range-parser/package.json +44 -0
  483. package/ngp/node_modules/raw-body/HISTORY.md +303 -0
  484. package/ngp/node_modules/raw-body/LICENSE +22 -0
  485. package/ngp/node_modules/raw-body/README.md +223 -0
  486. package/ngp/node_modules/raw-body/SECURITY.md +24 -0
  487. package/ngp/node_modules/raw-body/index.d.ts +87 -0
  488. package/ngp/node_modules/raw-body/index.js +329 -0
  489. package/ngp/node_modules/raw-body/node_modules/bytes/History.md +97 -0
  490. package/ngp/node_modules/raw-body/node_modules/bytes/LICENSE +23 -0
  491. package/ngp/node_modules/raw-body/node_modules/bytes/Readme.md +152 -0
  492. package/ngp/node_modules/raw-body/node_modules/bytes/index.js +170 -0
  493. package/ngp/node_modules/raw-body/node_modules/bytes/package.json +42 -0
  494. package/ngp/node_modules/raw-body/node_modules/iconv-lite/Changelog.md +162 -0
  495. package/ngp/node_modules/raw-body/node_modules/iconv-lite/LICENSE +21 -0
  496. package/ngp/node_modules/raw-body/node_modules/iconv-lite/README.md +156 -0
  497. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/dbcs-codec.js +555 -0
  498. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/dbcs-data.js +176 -0
  499. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/index.js +22 -0
  500. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/internal.js +188 -0
  501. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/sbcs-codec.js +72 -0
  502. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/sbcs-data-generated.js +451 -0
  503. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/sbcs-data.js +174 -0
  504. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/big5-added.json +122 -0
  505. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/cp936.json +264 -0
  506. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/cp949.json +273 -0
  507. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/cp950.json +177 -0
  508. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/eucjp.json +182 -0
  509. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json +1 -0
  510. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/gbk-added.json +55 -0
  511. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/tables/shiftjis.json +125 -0
  512. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/utf16.js +177 -0
  513. package/ngp/node_modules/raw-body/node_modules/iconv-lite/encodings/utf7.js +290 -0
  514. package/ngp/node_modules/raw-body/node_modules/iconv-lite/lib/bom-handling.js +52 -0
  515. package/ngp/node_modules/raw-body/node_modules/iconv-lite/lib/extend-node.js +217 -0
  516. package/ngp/node_modules/raw-body/node_modules/iconv-lite/lib/index.d.ts +24 -0
  517. package/ngp/node_modules/raw-body/node_modules/iconv-lite/lib/index.js +153 -0
  518. package/ngp/node_modules/raw-body/node_modules/iconv-lite/lib/streams.js +121 -0
  519. package/ngp/node_modules/raw-body/node_modules/iconv-lite/package.json +46 -0
  520. package/ngp/node_modules/raw-body/package.json +49 -0
  521. package/ngp/node_modules/readdirp/LICENSE +21 -0
  522. package/ngp/node_modules/readdirp/README.md +122 -0
  523. package/ngp/node_modules/readdirp/index.d.ts +43 -0
  524. package/ngp/node_modules/readdirp/index.js +287 -0
  525. package/ngp/node_modules/readdirp/package.json +122 -0
  526. package/ngp/node_modules/safe-buffer/LICENSE +21 -0
  527. package/ngp/node_modules/safe-buffer/README.md +584 -0
  528. package/ngp/node_modules/safe-buffer/index.d.ts +187 -0
  529. package/ngp/node_modules/safe-buffer/index.js +62 -0
  530. package/ngp/node_modules/safe-buffer/package.json +37 -0
  531. package/ngp/node_modules/safer-buffer/LICENSE +21 -0
  532. package/ngp/node_modules/safer-buffer/Porting-Buffer.md +268 -0
  533. package/ngp/node_modules/safer-buffer/Readme.md +156 -0
  534. package/ngp/node_modules/safer-buffer/dangerous.js +58 -0
  535. package/ngp/node_modules/safer-buffer/package.json +34 -0
  536. package/ngp/node_modules/safer-buffer/safer.js +77 -0
  537. package/ngp/node_modules/safer-buffer/tests.js +406 -0
  538. package/ngp/node_modules/send/HISTORY.md +521 -0
  539. package/ngp/node_modules/send/LICENSE +23 -0
  540. package/ngp/node_modules/send/README.md +327 -0
  541. package/ngp/node_modules/send/SECURITY.md +24 -0
  542. package/ngp/node_modules/send/index.js +1143 -0
  543. package/ngp/node_modules/send/node_modules/ms/index.js +162 -0
  544. package/ngp/node_modules/send/node_modules/ms/license.md +21 -0
  545. package/ngp/node_modules/send/node_modules/ms/package.json +38 -0
  546. package/ngp/node_modules/send/node_modules/ms/readme.md +59 -0
  547. package/ngp/node_modules/send/package.json +62 -0
  548. package/ngp/node_modules/serve-static/HISTORY.md +471 -0
  549. package/ngp/node_modules/serve-static/LICENSE +25 -0
  550. package/ngp/node_modules/serve-static/README.md +257 -0
  551. package/ngp/node_modules/serve-static/index.js +210 -0
  552. package/ngp/node_modules/serve-static/package.json +42 -0
  553. package/ngp/node_modules/setprototypeof/LICENSE +13 -0
  554. package/ngp/node_modules/setprototypeof/README.md +31 -0
  555. package/ngp/node_modules/setprototypeof/index.d.ts +2 -0
  556. package/ngp/node_modules/setprototypeof/index.js +17 -0
  557. package/ngp/node_modules/setprototypeof/package.json +38 -0
  558. package/ngp/node_modules/setprototypeof/test/index.js +24 -0
  559. package/ngp/node_modules/side-channel/.eslintignore +1 -0
  560. package/ngp/node_modules/side-channel/.eslintrc +11 -0
  561. package/ngp/node_modules/side-channel/.github/FUNDING.yml +12 -0
  562. package/ngp/node_modules/side-channel/.nycrc +13 -0
  563. package/ngp/node_modules/side-channel/CHANGELOG.md +65 -0
  564. package/ngp/node_modules/side-channel/LICENSE +21 -0
  565. package/ngp/node_modules/side-channel/README.md +2 -0
  566. package/ngp/node_modules/side-channel/index.js +124 -0
  567. package/ngp/node_modules/side-channel/package.json +67 -0
  568. package/ngp/node_modules/side-channel/test/index.js +78 -0
  569. package/ngp/node_modules/statuses/HISTORY.md +82 -0
  570. package/ngp/node_modules/statuses/LICENSE +23 -0
  571. package/ngp/node_modules/statuses/README.md +136 -0
  572. package/ngp/node_modules/statuses/codes.json +65 -0
  573. package/ngp/node_modules/statuses/index.js +146 -0
  574. package/ngp/node_modules/statuses/package.json +49 -0
  575. package/ngp/node_modules/to-regex-range/LICENSE +21 -0
  576. package/ngp/node_modules/to-regex-range/README.md +305 -0
  577. package/ngp/node_modules/to-regex-range/index.js +288 -0
  578. package/ngp/node_modules/to-regex-range/package.json +88 -0
  579. package/ngp/node_modules/toidentifier/HISTORY.md +9 -0
  580. package/ngp/node_modules/toidentifier/LICENSE +21 -0
  581. package/ngp/node_modules/toidentifier/README.md +61 -0
  582. package/ngp/node_modules/toidentifier/index.js +32 -0
  583. package/ngp/node_modules/toidentifier/package.json +38 -0
  584. package/ngp/node_modules/type-is/HISTORY.md +259 -0
  585. package/ngp/node_modules/type-is/LICENSE +23 -0
  586. package/ngp/node_modules/type-is/README.md +170 -0
  587. package/ngp/node_modules/type-is/index.js +266 -0
  588. package/ngp/node_modules/type-is/package.json +45 -0
  589. package/ngp/node_modules/uglify-js/LICENSE +29 -0
  590. package/ngp/node_modules/uglify-js/README.md +1423 -0
  591. package/ngp/node_modules/uglify-js/bin/uglifyjs +603 -0
  592. package/ngp/node_modules/uglify-js/lib/ast.js +2132 -0
  593. package/ngp/node_modules/uglify-js/lib/compress.js +13762 -0
  594. package/ngp/node_modules/uglify-js/lib/minify.js +277 -0
  595. package/ngp/node_modules/uglify-js/lib/mozilla-ast.js +1274 -0
  596. package/ngp/node_modules/uglify-js/lib/output.js +1936 -0
  597. package/ngp/node_modules/uglify-js/lib/parse.js +2559 -0
  598. package/ngp/node_modules/uglify-js/lib/propmangle.js +259 -0
  599. package/ngp/node_modules/uglify-js/lib/scope.js +860 -0
  600. package/ngp/node_modules/uglify-js/lib/sourcemap.js +195 -0
  601. package/ngp/node_modules/uglify-js/lib/transform.js +250 -0
  602. package/ngp/node_modules/uglify-js/lib/utils.js +285 -0
  603. package/ngp/node_modules/uglify-js/package.json +56 -0
  604. package/ngp/node_modules/uglify-js/tools/domprops.html +456 -0
  605. package/ngp/node_modules/uglify-js/tools/domprops.json +8325 -0
  606. package/ngp/node_modules/uglify-js/tools/exports.js +8 -0
  607. package/ngp/node_modules/uglify-js/tools/node.js +110 -0
  608. package/ngp/node_modules/uglify-js/tools/tty.js +22 -0
  609. package/ngp/node_modules/unpipe/HISTORY.md +4 -0
  610. package/ngp/node_modules/unpipe/LICENSE +22 -0
  611. package/ngp/node_modules/unpipe/README.md +43 -0
  612. package/ngp/node_modules/unpipe/index.js +69 -0
  613. package/ngp/node_modules/unpipe/package.json +27 -0
  614. package/ngp/node_modules/utils-merge/LICENSE +20 -0
  615. package/ngp/node_modules/utils-merge/README.md +34 -0
  616. package/ngp/node_modules/utils-merge/index.js +23 -0
  617. package/ngp/node_modules/utils-merge/package.json +40 -0
  618. package/ngp/node_modules/vary/HISTORY.md +39 -0
  619. package/ngp/node_modules/vary/LICENSE +22 -0
  620. package/ngp/node_modules/vary/README.md +101 -0
  621. package/ngp/node_modules/vary/index.js +149 -0
  622. package/ngp/node_modules/vary/package.json +43 -0
  623. package/ngp/package-lock.json +1508 -0
  624. package/package.json +3 -2
  625. package/readme.md +0 -4
@@ -0,0 +1,1143 @@
1
+ /*!
2
+ * send
3
+ * Copyright(c) 2012 TJ Holowaychuk
4
+ * Copyright(c) 2014-2022 Douglas Christopher Wilson
5
+ * MIT Licensed
6
+ */
7
+
8
+ 'use strict'
9
+
10
+ /**
11
+ * Module dependencies.
12
+ * @private
13
+ */
14
+
15
+ var createError = require('http-errors')
16
+ var debug = require('debug')('send')
17
+ var deprecate = require('depd')('send')
18
+ var destroy = require('destroy')
19
+ var encodeUrl = require('encodeurl')
20
+ var escapeHtml = require('escape-html')
21
+ var etag = require('etag')
22
+ var fresh = require('fresh')
23
+ var fs = require('fs')
24
+ var mime = require('mime')
25
+ var ms = require('ms')
26
+ var onFinished = require('on-finished')
27
+ var parseRange = require('range-parser')
28
+ var path = require('path')
29
+ var statuses = require('statuses')
30
+ var Stream = require('stream')
31
+ var util = require('util')
32
+
33
+ /**
34
+ * Path function references.
35
+ * @private
36
+ */
37
+
38
+ var extname = path.extname
39
+ var join = path.join
40
+ var normalize = path.normalize
41
+ var resolve = path.resolve
42
+ var sep = path.sep
43
+
44
+ /**
45
+ * Regular expression for identifying a bytes Range header.
46
+ * @private
47
+ */
48
+
49
+ var BYTES_RANGE_REGEXP = /^ *bytes=/
50
+
51
+ /**
52
+ * Maximum value allowed for the max age.
53
+ * @private
54
+ */
55
+
56
+ var MAX_MAXAGE = 60 * 60 * 24 * 365 * 1000 // 1 year
57
+
58
+ /**
59
+ * Regular expression to match a path with a directory up component.
60
+ * @private
61
+ */
62
+
63
+ var UP_PATH_REGEXP = /(?:^|[\\/])\.\.(?:[\\/]|$)/
64
+
65
+ /**
66
+ * Module exports.
67
+ * @public
68
+ */
69
+
70
+ module.exports = send
71
+ module.exports.mime = mime
72
+
73
+ /**
74
+ * Return a `SendStream` for `req` and `path`.
75
+ *
76
+ * @param {object} req
77
+ * @param {string} path
78
+ * @param {object} [options]
79
+ * @return {SendStream}
80
+ * @public
81
+ */
82
+
83
+ function send (req, path, options) {
84
+ return new SendStream(req, path, options)
85
+ }
86
+
87
+ /**
88
+ * Initialize a `SendStream` with the given `path`.
89
+ *
90
+ * @param {Request} req
91
+ * @param {String} path
92
+ * @param {object} [options]
93
+ * @private
94
+ */
95
+
96
+ function SendStream (req, path, options) {
97
+ Stream.call(this)
98
+
99
+ var opts = options || {}
100
+
101
+ this.options = opts
102
+ this.path = path
103
+ this.req = req
104
+
105
+ this._acceptRanges = opts.acceptRanges !== undefined
106
+ ? Boolean(opts.acceptRanges)
107
+ : true
108
+
109
+ this._cacheControl = opts.cacheControl !== undefined
110
+ ? Boolean(opts.cacheControl)
111
+ : true
112
+
113
+ this._etag = opts.etag !== undefined
114
+ ? Boolean(opts.etag)
115
+ : true
116
+
117
+ this._dotfiles = opts.dotfiles !== undefined
118
+ ? opts.dotfiles
119
+ : 'ignore'
120
+
121
+ if (this._dotfiles !== 'ignore' && this._dotfiles !== 'allow' && this._dotfiles !== 'deny') {
122
+ throw new TypeError('dotfiles option must be "allow", "deny", or "ignore"')
123
+ }
124
+
125
+ this._hidden = Boolean(opts.hidden)
126
+
127
+ if (opts.hidden !== undefined) {
128
+ deprecate('hidden: use dotfiles: \'' + (this._hidden ? 'allow' : 'ignore') + '\' instead')
129
+ }
130
+
131
+ // legacy support
132
+ if (opts.dotfiles === undefined) {
133
+ this._dotfiles = undefined
134
+ }
135
+
136
+ this._extensions = opts.extensions !== undefined
137
+ ? normalizeList(opts.extensions, 'extensions option')
138
+ : []
139
+
140
+ this._immutable = opts.immutable !== undefined
141
+ ? Boolean(opts.immutable)
142
+ : false
143
+
144
+ this._index = opts.index !== undefined
145
+ ? normalizeList(opts.index, 'index option')
146
+ : ['index.html']
147
+
148
+ this._lastModified = opts.lastModified !== undefined
149
+ ? Boolean(opts.lastModified)
150
+ : true
151
+
152
+ this._maxage = opts.maxAge || opts.maxage
153
+ this._maxage = typeof this._maxage === 'string'
154
+ ? ms(this._maxage)
155
+ : Number(this._maxage)
156
+ this._maxage = !isNaN(this._maxage)
157
+ ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
158
+ : 0
159
+
160
+ this._root = opts.root
161
+ ? resolve(opts.root)
162
+ : null
163
+
164
+ if (!this._root && opts.from) {
165
+ this.from(opts.from)
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Inherits from `Stream`.
171
+ */
172
+
173
+ util.inherits(SendStream, Stream)
174
+
175
+ /**
176
+ * Enable or disable etag generation.
177
+ *
178
+ * @param {Boolean} val
179
+ * @return {SendStream}
180
+ * @api public
181
+ */
182
+
183
+ SendStream.prototype.etag = deprecate.function(function etag (val) {
184
+ this._etag = Boolean(val)
185
+ debug('etag %s', this._etag)
186
+ return this
187
+ }, 'send.etag: pass etag as option')
188
+
189
+ /**
190
+ * Enable or disable "hidden" (dot) files.
191
+ *
192
+ * @param {Boolean} path
193
+ * @return {SendStream}
194
+ * @api public
195
+ */
196
+
197
+ SendStream.prototype.hidden = deprecate.function(function hidden (val) {
198
+ this._hidden = Boolean(val)
199
+ this._dotfiles = undefined
200
+ debug('hidden %s', this._hidden)
201
+ return this
202
+ }, 'send.hidden: use dotfiles option')
203
+
204
+ /**
205
+ * Set index `paths`, set to a falsy
206
+ * value to disable index support.
207
+ *
208
+ * @param {String|Boolean|Array} paths
209
+ * @return {SendStream}
210
+ * @api public
211
+ */
212
+
213
+ SendStream.prototype.index = deprecate.function(function index (paths) {
214
+ var index = !paths ? [] : normalizeList(paths, 'paths argument')
215
+ debug('index %o', paths)
216
+ this._index = index
217
+ return this
218
+ }, 'send.index: pass index as option')
219
+
220
+ /**
221
+ * Set root `path`.
222
+ *
223
+ * @param {String} path
224
+ * @return {SendStream}
225
+ * @api public
226
+ */
227
+
228
+ SendStream.prototype.root = function root (path) {
229
+ this._root = resolve(String(path))
230
+ debug('root %s', this._root)
231
+ return this
232
+ }
233
+
234
+ SendStream.prototype.from = deprecate.function(SendStream.prototype.root,
235
+ 'send.from: pass root as option')
236
+
237
+ SendStream.prototype.root = deprecate.function(SendStream.prototype.root,
238
+ 'send.root: pass root as option')
239
+
240
+ /**
241
+ * Set max-age to `maxAge`.
242
+ *
243
+ * @param {Number} maxAge
244
+ * @return {SendStream}
245
+ * @api public
246
+ */
247
+
248
+ SendStream.prototype.maxage = deprecate.function(function maxage (maxAge) {
249
+ this._maxage = typeof maxAge === 'string'
250
+ ? ms(maxAge)
251
+ : Number(maxAge)
252
+ this._maxage = !isNaN(this._maxage)
253
+ ? Math.min(Math.max(0, this._maxage), MAX_MAXAGE)
254
+ : 0
255
+ debug('max-age %d', this._maxage)
256
+ return this
257
+ }, 'send.maxage: pass maxAge as option')
258
+
259
+ /**
260
+ * Emit error with `status`.
261
+ *
262
+ * @param {number} status
263
+ * @param {Error} [err]
264
+ * @private
265
+ */
266
+
267
+ SendStream.prototype.error = function error (status, err) {
268
+ // emit if listeners instead of responding
269
+ if (hasListeners(this, 'error')) {
270
+ return this.emit('error', createHttpError(status, err))
271
+ }
272
+
273
+ var res = this.res
274
+ var msg = statuses.message[status] || String(status)
275
+ var doc = createHtmlDocument('Error', escapeHtml(msg))
276
+
277
+ // clear existing headers
278
+ clearHeaders(res)
279
+
280
+ // add error headers
281
+ if (err && err.headers) {
282
+ setHeaders(res, err.headers)
283
+ }
284
+
285
+ // send basic response
286
+ res.statusCode = status
287
+ res.setHeader('Content-Type', 'text/html; charset=UTF-8')
288
+ res.setHeader('Content-Length', Buffer.byteLength(doc))
289
+ res.setHeader('Content-Security-Policy', "default-src 'none'")
290
+ res.setHeader('X-Content-Type-Options', 'nosniff')
291
+ res.end(doc)
292
+ }
293
+
294
+ /**
295
+ * Check if the pathname ends with "/".
296
+ *
297
+ * @return {boolean}
298
+ * @private
299
+ */
300
+
301
+ SendStream.prototype.hasTrailingSlash = function hasTrailingSlash () {
302
+ return this.path[this.path.length - 1] === '/'
303
+ }
304
+
305
+ /**
306
+ * Check if this is a conditional GET request.
307
+ *
308
+ * @return {Boolean}
309
+ * @api private
310
+ */
311
+
312
+ SendStream.prototype.isConditionalGET = function isConditionalGET () {
313
+ return this.req.headers['if-match'] ||
314
+ this.req.headers['if-unmodified-since'] ||
315
+ this.req.headers['if-none-match'] ||
316
+ this.req.headers['if-modified-since']
317
+ }
318
+
319
+ /**
320
+ * Check if the request preconditions failed.
321
+ *
322
+ * @return {boolean}
323
+ * @private
324
+ */
325
+
326
+ SendStream.prototype.isPreconditionFailure = function isPreconditionFailure () {
327
+ var req = this.req
328
+ var res = this.res
329
+
330
+ // if-match
331
+ var match = req.headers['if-match']
332
+ if (match) {
333
+ var etag = res.getHeader('ETag')
334
+ return !etag || (match !== '*' && parseTokenList(match).every(function (match) {
335
+ return match !== etag && match !== 'W/' + etag && 'W/' + match !== etag
336
+ }))
337
+ }
338
+
339
+ // if-unmodified-since
340
+ var unmodifiedSince = parseHttpDate(req.headers['if-unmodified-since'])
341
+ if (!isNaN(unmodifiedSince)) {
342
+ var lastModified = parseHttpDate(res.getHeader('Last-Modified'))
343
+ return isNaN(lastModified) || lastModified > unmodifiedSince
344
+ }
345
+
346
+ return false
347
+ }
348
+
349
+ /**
350
+ * Strip various content header fields for a change in entity.
351
+ *
352
+ * @private
353
+ */
354
+
355
+ SendStream.prototype.removeContentHeaderFields = function removeContentHeaderFields () {
356
+ var res = this.res
357
+
358
+ res.removeHeader('Content-Encoding')
359
+ res.removeHeader('Content-Language')
360
+ res.removeHeader('Content-Length')
361
+ res.removeHeader('Content-Range')
362
+ res.removeHeader('Content-Type')
363
+ }
364
+
365
+ /**
366
+ * Respond with 304 not modified.
367
+ *
368
+ * @api private
369
+ */
370
+
371
+ SendStream.prototype.notModified = function notModified () {
372
+ var res = this.res
373
+ debug('not modified')
374
+ this.removeContentHeaderFields()
375
+ res.statusCode = 304
376
+ res.end()
377
+ }
378
+
379
+ /**
380
+ * Raise error that headers already sent.
381
+ *
382
+ * @api private
383
+ */
384
+
385
+ SendStream.prototype.headersAlreadySent = function headersAlreadySent () {
386
+ var err = new Error('Can\'t set headers after they are sent.')
387
+ debug('headers already sent')
388
+ this.error(500, err)
389
+ }
390
+
391
+ /**
392
+ * Check if the request is cacheable, aka
393
+ * responded with 2xx or 304 (see RFC 2616 section 14.2{5,6}).
394
+ *
395
+ * @return {Boolean}
396
+ * @api private
397
+ */
398
+
399
+ SendStream.prototype.isCachable = function isCachable () {
400
+ var statusCode = this.res.statusCode
401
+ return (statusCode >= 200 && statusCode < 300) ||
402
+ statusCode === 304
403
+ }
404
+
405
+ /**
406
+ * Handle stat() error.
407
+ *
408
+ * @param {Error} error
409
+ * @private
410
+ */
411
+
412
+ SendStream.prototype.onStatError = function onStatError (error) {
413
+ switch (error.code) {
414
+ case 'ENAMETOOLONG':
415
+ case 'ENOENT':
416
+ case 'ENOTDIR':
417
+ this.error(404, error)
418
+ break
419
+ default:
420
+ this.error(500, error)
421
+ break
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Check if the cache is fresh.
427
+ *
428
+ * @return {Boolean}
429
+ * @api private
430
+ */
431
+
432
+ SendStream.prototype.isFresh = function isFresh () {
433
+ return fresh(this.req.headers, {
434
+ etag: this.res.getHeader('ETag'),
435
+ 'last-modified': this.res.getHeader('Last-Modified')
436
+ })
437
+ }
438
+
439
+ /**
440
+ * Check if the range is fresh.
441
+ *
442
+ * @return {Boolean}
443
+ * @api private
444
+ */
445
+
446
+ SendStream.prototype.isRangeFresh = function isRangeFresh () {
447
+ var ifRange = this.req.headers['if-range']
448
+
449
+ if (!ifRange) {
450
+ return true
451
+ }
452
+
453
+ // if-range as etag
454
+ if (ifRange.indexOf('"') !== -1) {
455
+ var etag = this.res.getHeader('ETag')
456
+ return Boolean(etag && ifRange.indexOf(etag) !== -1)
457
+ }
458
+
459
+ // if-range as modified date
460
+ var lastModified = this.res.getHeader('Last-Modified')
461
+ return parseHttpDate(lastModified) <= parseHttpDate(ifRange)
462
+ }
463
+
464
+ /**
465
+ * Redirect to path.
466
+ *
467
+ * @param {string} path
468
+ * @private
469
+ */
470
+
471
+ SendStream.prototype.redirect = function redirect (path) {
472
+ var res = this.res
473
+
474
+ if (hasListeners(this, 'directory')) {
475
+ this.emit('directory', res, path)
476
+ return
477
+ }
478
+
479
+ if (this.hasTrailingSlash()) {
480
+ this.error(403)
481
+ return
482
+ }
483
+
484
+ var loc = encodeUrl(collapseLeadingSlashes(this.path + '/'))
485
+ var doc = createHtmlDocument('Redirecting', 'Redirecting to <a href="' + escapeHtml(loc) + '">' +
486
+ escapeHtml(loc) + '</a>')
487
+
488
+ // redirect
489
+ res.statusCode = 301
490
+ res.setHeader('Content-Type', 'text/html; charset=UTF-8')
491
+ res.setHeader('Content-Length', Buffer.byteLength(doc))
492
+ res.setHeader('Content-Security-Policy', "default-src 'none'")
493
+ res.setHeader('X-Content-Type-Options', 'nosniff')
494
+ res.setHeader('Location', loc)
495
+ res.end(doc)
496
+ }
497
+
498
+ /**
499
+ * Pipe to `res.
500
+ *
501
+ * @param {Stream} res
502
+ * @return {Stream} res
503
+ * @api public
504
+ */
505
+
506
+ SendStream.prototype.pipe = function pipe (res) {
507
+ // root path
508
+ var root = this._root
509
+
510
+ // references
511
+ this.res = res
512
+
513
+ // decode the path
514
+ var path = decode(this.path)
515
+ if (path === -1) {
516
+ this.error(400)
517
+ return res
518
+ }
519
+
520
+ // null byte(s)
521
+ if (~path.indexOf('\0')) {
522
+ this.error(400)
523
+ return res
524
+ }
525
+
526
+ var parts
527
+ if (root !== null) {
528
+ // normalize
529
+ if (path) {
530
+ path = normalize('.' + sep + path)
531
+ }
532
+
533
+ // malicious path
534
+ if (UP_PATH_REGEXP.test(path)) {
535
+ debug('malicious path "%s"', path)
536
+ this.error(403)
537
+ return res
538
+ }
539
+
540
+ // explode path parts
541
+ parts = path.split(sep)
542
+
543
+ // join / normalize from optional root dir
544
+ path = normalize(join(root, path))
545
+ } else {
546
+ // ".." is malicious without "root"
547
+ if (UP_PATH_REGEXP.test(path)) {
548
+ debug('malicious path "%s"', path)
549
+ this.error(403)
550
+ return res
551
+ }
552
+
553
+ // explode path parts
554
+ parts = normalize(path).split(sep)
555
+
556
+ // resolve the path
557
+ path = resolve(path)
558
+ }
559
+
560
+ // dotfile handling
561
+ if (containsDotFile(parts)) {
562
+ var access = this._dotfiles
563
+
564
+ // legacy support
565
+ if (access === undefined) {
566
+ access = parts[parts.length - 1][0] === '.'
567
+ ? (this._hidden ? 'allow' : 'ignore')
568
+ : 'allow'
569
+ }
570
+
571
+ debug('%s dotfile "%s"', access, path)
572
+ switch (access) {
573
+ case 'allow':
574
+ break
575
+ case 'deny':
576
+ this.error(403)
577
+ return res
578
+ case 'ignore':
579
+ default:
580
+ this.error(404)
581
+ return res
582
+ }
583
+ }
584
+
585
+ // index file support
586
+ if (this._index.length && this.hasTrailingSlash()) {
587
+ this.sendIndex(path)
588
+ return res
589
+ }
590
+
591
+ this.sendFile(path)
592
+ return res
593
+ }
594
+
595
+ /**
596
+ * Transfer `path`.
597
+ *
598
+ * @param {String} path
599
+ * @api public
600
+ */
601
+
602
+ SendStream.prototype.send = function send (path, stat) {
603
+ var len = stat.size
604
+ var options = this.options
605
+ var opts = {}
606
+ var res = this.res
607
+ var req = this.req
608
+ var ranges = req.headers.range
609
+ var offset = options.start || 0
610
+
611
+ if (headersSent(res)) {
612
+ // impossible to send now
613
+ this.headersAlreadySent()
614
+ return
615
+ }
616
+
617
+ debug('pipe "%s"', path)
618
+
619
+ // set header fields
620
+ this.setHeader(path, stat)
621
+
622
+ // set content-type
623
+ this.type(path)
624
+
625
+ // conditional GET support
626
+ if (this.isConditionalGET()) {
627
+ if (this.isPreconditionFailure()) {
628
+ this.error(412)
629
+ return
630
+ }
631
+
632
+ if (this.isCachable() && this.isFresh()) {
633
+ this.notModified()
634
+ return
635
+ }
636
+ }
637
+
638
+ // adjust len to start/end options
639
+ len = Math.max(0, len - offset)
640
+ if (options.end !== undefined) {
641
+ var bytes = options.end - offset + 1
642
+ if (len > bytes) len = bytes
643
+ }
644
+
645
+ // Range support
646
+ if (this._acceptRanges && BYTES_RANGE_REGEXP.test(ranges)) {
647
+ // parse
648
+ ranges = parseRange(len, ranges, {
649
+ combine: true
650
+ })
651
+
652
+ // If-Range support
653
+ if (!this.isRangeFresh()) {
654
+ debug('range stale')
655
+ ranges = -2
656
+ }
657
+
658
+ // unsatisfiable
659
+ if (ranges === -1) {
660
+ debug('range unsatisfiable')
661
+
662
+ // Content-Range
663
+ res.setHeader('Content-Range', contentRange('bytes', len))
664
+
665
+ // 416 Requested Range Not Satisfiable
666
+ return this.error(416, {
667
+ headers: { 'Content-Range': res.getHeader('Content-Range') }
668
+ })
669
+ }
670
+
671
+ // valid (syntactically invalid/multiple ranges are treated as a regular response)
672
+ if (ranges !== -2 && ranges.length === 1) {
673
+ debug('range %j', ranges)
674
+
675
+ // Content-Range
676
+ res.statusCode = 206
677
+ res.setHeader('Content-Range', contentRange('bytes', len, ranges[0]))
678
+
679
+ // adjust for requested range
680
+ offset += ranges[0].start
681
+ len = ranges[0].end - ranges[0].start + 1
682
+ }
683
+ }
684
+
685
+ // clone options
686
+ for (var prop in options) {
687
+ opts[prop] = options[prop]
688
+ }
689
+
690
+ // set read options
691
+ opts.start = offset
692
+ opts.end = Math.max(offset, offset + len - 1)
693
+
694
+ // content-length
695
+ res.setHeader('Content-Length', len)
696
+
697
+ // HEAD support
698
+ if (req.method === 'HEAD') {
699
+ res.end()
700
+ return
701
+ }
702
+
703
+ this.stream(path, opts)
704
+ }
705
+
706
+ /**
707
+ * Transfer file for `path`.
708
+ *
709
+ * @param {String} path
710
+ * @api private
711
+ */
712
+ SendStream.prototype.sendFile = function sendFile (path) {
713
+ var i = 0
714
+ var self = this
715
+
716
+ debug('stat "%s"', path)
717
+ fs.stat(path, function onstat (err, stat) {
718
+ if (err && err.code === 'ENOENT' && !extname(path) && path[path.length - 1] !== sep) {
719
+ // not found, check extensions
720
+ return next(err)
721
+ }
722
+ if (err) return self.onStatError(err)
723
+ if (stat.isDirectory()) return self.redirect(path)
724
+ self.emit('file', path, stat)
725
+ self.send(path, stat)
726
+ })
727
+
728
+ function next (err) {
729
+ if (self._extensions.length <= i) {
730
+ return err
731
+ ? self.onStatError(err)
732
+ : self.error(404)
733
+ }
734
+
735
+ var p = path + '.' + self._extensions[i++]
736
+
737
+ debug('stat "%s"', p)
738
+ fs.stat(p, function (err, stat) {
739
+ if (err) return next(err)
740
+ if (stat.isDirectory()) return next()
741
+ self.emit('file', p, stat)
742
+ self.send(p, stat)
743
+ })
744
+ }
745
+ }
746
+
747
+ /**
748
+ * Transfer index for `path`.
749
+ *
750
+ * @param {String} path
751
+ * @api private
752
+ */
753
+ SendStream.prototype.sendIndex = function sendIndex (path) {
754
+ var i = -1
755
+ var self = this
756
+
757
+ function next (err) {
758
+ if (++i >= self._index.length) {
759
+ if (err) return self.onStatError(err)
760
+ return self.error(404)
761
+ }
762
+
763
+ var p = join(path, self._index[i])
764
+
765
+ debug('stat "%s"', p)
766
+ fs.stat(p, function (err, stat) {
767
+ if (err) return next(err)
768
+ if (stat.isDirectory()) return next()
769
+ self.emit('file', p, stat)
770
+ self.send(p, stat)
771
+ })
772
+ }
773
+
774
+ next()
775
+ }
776
+
777
+ /**
778
+ * Stream `path` to the response.
779
+ *
780
+ * @param {String} path
781
+ * @param {Object} options
782
+ * @api private
783
+ */
784
+
785
+ SendStream.prototype.stream = function stream (path, options) {
786
+ var self = this
787
+ var res = this.res
788
+
789
+ // pipe
790
+ var stream = fs.createReadStream(path, options)
791
+ this.emit('stream', stream)
792
+ stream.pipe(res)
793
+
794
+ // cleanup
795
+ function cleanup () {
796
+ destroy(stream, true)
797
+ }
798
+
799
+ // response finished, cleanup
800
+ onFinished(res, cleanup)
801
+
802
+ // error handling
803
+ stream.on('error', function onerror (err) {
804
+ // clean up stream early
805
+ cleanup()
806
+
807
+ // error
808
+ self.onStatError(err)
809
+ })
810
+
811
+ // end
812
+ stream.on('end', function onend () {
813
+ self.emit('end')
814
+ })
815
+ }
816
+
817
+ /**
818
+ * Set content-type based on `path`
819
+ * if it hasn't been explicitly set.
820
+ *
821
+ * @param {String} path
822
+ * @api private
823
+ */
824
+
825
+ SendStream.prototype.type = function type (path) {
826
+ var res = this.res
827
+
828
+ if (res.getHeader('Content-Type')) return
829
+
830
+ var type = mime.lookup(path)
831
+
832
+ if (!type) {
833
+ debug('no content-type')
834
+ return
835
+ }
836
+
837
+ var charset = mime.charsets.lookup(type)
838
+
839
+ debug('content-type %s', type)
840
+ res.setHeader('Content-Type', type + (charset ? '; charset=' + charset : ''))
841
+ }
842
+
843
+ /**
844
+ * Set response header fields, most
845
+ * fields may be pre-defined.
846
+ *
847
+ * @param {String} path
848
+ * @param {Object} stat
849
+ * @api private
850
+ */
851
+
852
+ SendStream.prototype.setHeader = function setHeader (path, stat) {
853
+ var res = this.res
854
+
855
+ this.emit('headers', res, path, stat)
856
+
857
+ if (this._acceptRanges && !res.getHeader('Accept-Ranges')) {
858
+ debug('accept ranges')
859
+ res.setHeader('Accept-Ranges', 'bytes')
860
+ }
861
+
862
+ if (this._cacheControl && !res.getHeader('Cache-Control')) {
863
+ var cacheControl = 'public, max-age=' + Math.floor(this._maxage / 1000)
864
+
865
+ if (this._immutable) {
866
+ cacheControl += ', immutable'
867
+ }
868
+
869
+ debug('cache-control %s', cacheControl)
870
+ res.setHeader('Cache-Control', cacheControl)
871
+ }
872
+
873
+ if (this._lastModified && !res.getHeader('Last-Modified')) {
874
+ var modified = stat.mtime.toUTCString()
875
+ debug('modified %s', modified)
876
+ res.setHeader('Last-Modified', modified)
877
+ }
878
+
879
+ if (this._etag && !res.getHeader('ETag')) {
880
+ var val = etag(stat)
881
+ debug('etag %s', val)
882
+ res.setHeader('ETag', val)
883
+ }
884
+ }
885
+
886
+ /**
887
+ * Clear all headers from a response.
888
+ *
889
+ * @param {object} res
890
+ * @private
891
+ */
892
+
893
+ function clearHeaders (res) {
894
+ var headers = getHeaderNames(res)
895
+
896
+ for (var i = 0; i < headers.length; i++) {
897
+ res.removeHeader(headers[i])
898
+ }
899
+ }
900
+
901
+ /**
902
+ * Collapse all leading slashes into a single slash
903
+ *
904
+ * @param {string} str
905
+ * @private
906
+ */
907
+ function collapseLeadingSlashes (str) {
908
+ for (var i = 0; i < str.length; i++) {
909
+ if (str[i] !== '/') {
910
+ break
911
+ }
912
+ }
913
+
914
+ return i > 1
915
+ ? '/' + str.substr(i)
916
+ : str
917
+ }
918
+
919
+ /**
920
+ * Determine if path parts contain a dotfile.
921
+ *
922
+ * @api private
923
+ */
924
+
925
+ function containsDotFile (parts) {
926
+ for (var i = 0; i < parts.length; i++) {
927
+ var part = parts[i]
928
+ if (part.length > 1 && part[0] === '.') {
929
+ return true
930
+ }
931
+ }
932
+
933
+ return false
934
+ }
935
+
936
+ /**
937
+ * Create a Content-Range header.
938
+ *
939
+ * @param {string} type
940
+ * @param {number} size
941
+ * @param {array} [range]
942
+ */
943
+
944
+ function contentRange (type, size, range) {
945
+ return type + ' ' + (range ? range.start + '-' + range.end : '*') + '/' + size
946
+ }
947
+
948
+ /**
949
+ * Create a minimal HTML document.
950
+ *
951
+ * @param {string} title
952
+ * @param {string} body
953
+ * @private
954
+ */
955
+
956
+ function createHtmlDocument (title, body) {
957
+ return '<!DOCTYPE html>\n' +
958
+ '<html lang="en">\n' +
959
+ '<head>\n' +
960
+ '<meta charset="utf-8">\n' +
961
+ '<title>' + title + '</title>\n' +
962
+ '</head>\n' +
963
+ '<body>\n' +
964
+ '<pre>' + body + '</pre>\n' +
965
+ '</body>\n' +
966
+ '</html>\n'
967
+ }
968
+
969
+ /**
970
+ * Create a HttpError object from simple arguments.
971
+ *
972
+ * @param {number} status
973
+ * @param {Error|object} err
974
+ * @private
975
+ */
976
+
977
+ function createHttpError (status, err) {
978
+ if (!err) {
979
+ return createError(status)
980
+ }
981
+
982
+ return err instanceof Error
983
+ ? createError(status, err, { expose: false })
984
+ : createError(status, err)
985
+ }
986
+
987
+ /**
988
+ * decodeURIComponent.
989
+ *
990
+ * Allows V8 to only deoptimize this fn instead of all
991
+ * of send().
992
+ *
993
+ * @param {String} path
994
+ * @api private
995
+ */
996
+
997
+ function decode (path) {
998
+ try {
999
+ return decodeURIComponent(path)
1000
+ } catch (err) {
1001
+ return -1
1002
+ }
1003
+ }
1004
+
1005
+ /**
1006
+ * Get the header names on a respnse.
1007
+ *
1008
+ * @param {object} res
1009
+ * @returns {array[string]}
1010
+ * @private
1011
+ */
1012
+
1013
+ function getHeaderNames (res) {
1014
+ return typeof res.getHeaderNames !== 'function'
1015
+ ? Object.keys(res._headers || {})
1016
+ : res.getHeaderNames()
1017
+ }
1018
+
1019
+ /**
1020
+ * Determine if emitter has listeners of a given type.
1021
+ *
1022
+ * The way to do this check is done three different ways in Node.js >= 0.8
1023
+ * so this consolidates them into a minimal set using instance methods.
1024
+ *
1025
+ * @param {EventEmitter} emitter
1026
+ * @param {string} type
1027
+ * @returns {boolean}
1028
+ * @private
1029
+ */
1030
+
1031
+ function hasListeners (emitter, type) {
1032
+ var count = typeof emitter.listenerCount !== 'function'
1033
+ ? emitter.listeners(type).length
1034
+ : emitter.listenerCount(type)
1035
+
1036
+ return count > 0
1037
+ }
1038
+
1039
+ /**
1040
+ * Determine if the response headers have been sent.
1041
+ *
1042
+ * @param {object} res
1043
+ * @returns {boolean}
1044
+ * @private
1045
+ */
1046
+
1047
+ function headersSent (res) {
1048
+ return typeof res.headersSent !== 'boolean'
1049
+ ? Boolean(res._header)
1050
+ : res.headersSent
1051
+ }
1052
+
1053
+ /**
1054
+ * Normalize the index option into an array.
1055
+ *
1056
+ * @param {boolean|string|array} val
1057
+ * @param {string} name
1058
+ * @private
1059
+ */
1060
+
1061
+ function normalizeList (val, name) {
1062
+ var list = [].concat(val || [])
1063
+
1064
+ for (var i = 0; i < list.length; i++) {
1065
+ if (typeof list[i] !== 'string') {
1066
+ throw new TypeError(name + ' must be array of strings or false')
1067
+ }
1068
+ }
1069
+
1070
+ return list
1071
+ }
1072
+
1073
+ /**
1074
+ * Parse an HTTP Date into a number.
1075
+ *
1076
+ * @param {string} date
1077
+ * @private
1078
+ */
1079
+
1080
+ function parseHttpDate (date) {
1081
+ var timestamp = date && Date.parse(date)
1082
+
1083
+ return typeof timestamp === 'number'
1084
+ ? timestamp
1085
+ : NaN
1086
+ }
1087
+
1088
+ /**
1089
+ * Parse a HTTP token list.
1090
+ *
1091
+ * @param {string} str
1092
+ * @private
1093
+ */
1094
+
1095
+ function parseTokenList (str) {
1096
+ var end = 0
1097
+ var list = []
1098
+ var start = 0
1099
+
1100
+ // gather tokens
1101
+ for (var i = 0, len = str.length; i < len; i++) {
1102
+ switch (str.charCodeAt(i)) {
1103
+ case 0x20: /* */
1104
+ if (start === end) {
1105
+ start = end = i + 1
1106
+ }
1107
+ break
1108
+ case 0x2c: /* , */
1109
+ if (start !== end) {
1110
+ list.push(str.substring(start, end))
1111
+ }
1112
+ start = end = i + 1
1113
+ break
1114
+ default:
1115
+ end = i + 1
1116
+ break
1117
+ }
1118
+ }
1119
+
1120
+ // final token
1121
+ if (start !== end) {
1122
+ list.push(str.substring(start, end))
1123
+ }
1124
+
1125
+ return list
1126
+ }
1127
+
1128
+ /**
1129
+ * Set an object of headers on a response.
1130
+ *
1131
+ * @param {object} res
1132
+ * @param {object} headers
1133
+ * @private
1134
+ */
1135
+
1136
+ function setHeaders (res, headers) {
1137
+ var keys = Object.keys(headers)
1138
+
1139
+ for (var i = 0; i < keys.length; i++) {
1140
+ var key = keys[i]
1141
+ res.setHeader(key, headers[key])
1142
+ }
1143
+ }