fastify 4.28.0 → 5.0.0-alpha.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 (514) hide show
  1. package/.idea/fastify.iml +12 -0
  2. package/.idea/inspectionProfiles/Project_Default.xml +6 -0
  3. package/.idea/jsLibraryMappings.xml +6 -0
  4. package/.idea/jsLinters/eslint.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/vcs.xml +6 -0
  7. package/.markdownlint-cli2.yaml +1 -1
  8. package/.taprc +4 -8
  9. package/README.md +3 -6
  10. package/build/build-error-serializer.js +4 -1
  11. package/build/build-validation.js +5 -4
  12. package/docs/Guides/Database.md +1 -1
  13. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  14. package/docs/Guides/Ecosystem.md +2 -0
  15. package/docs/Guides/Migration-Guide-V5.md +20 -0
  16. package/docs/Guides/Write-Type-Provider.md +4 -2
  17. package/docs/Reference/ContentTypeParser.md +30 -1
  18. package/docs/Reference/Decorators.md +42 -16
  19. package/docs/Reference/Errors.md +10 -2
  20. package/docs/Reference/Hooks.md +48 -14
  21. package/docs/Reference/Logging.md +5 -5
  22. package/docs/Reference/Reply.md +23 -18
  23. package/docs/Reference/Request.md +5 -1
  24. package/docs/Reference/Routes.md +24 -28
  25. package/docs/Reference/Server.md +14 -53
  26. package/docs/Reference/Type-Providers.md +21 -26
  27. package/docs/Reference/TypeScript.md +46 -29
  28. package/docs/Reference/Warnings.md +0 -8
  29. package/eslint.config.js +27 -0
  30. package/examples/typescript-server.ts +14 -14
  31. package/fastify.d.ts +15 -14
  32. package/fastify.js +41 -15
  33. package/lib/configValidator.js +94 -76
  34. package/lib/contentTypeParser.js +54 -88
  35. package/lib/decorate.js +3 -7
  36. package/lib/error-serializer.js +2 -1
  37. package/lib/errors.js +31 -6
  38. package/lib/handleRequest.js +70 -39
  39. package/lib/httpMethods.js +34 -18
  40. package/lib/logger.js +24 -6
  41. package/lib/pluginUtils.js +5 -5
  42. package/lib/reply.js +7 -10
  43. package/lib/request.js +37 -19
  44. package/lib/route.js +6 -34
  45. package/lib/server.js +62 -123
  46. package/lib/warnings.js +24 -29
  47. package/lib/wrapThenable.js +46 -22
  48. package/package.json +38 -58
  49. package/test/404s.test.js +8 -12
  50. package/test/async-await.test.js +46 -2
  51. package/test/build/error-serializer.test.js +4 -2
  52. package/test/check.test.js +225 -0
  53. package/test/close-pipelining.test.js +2 -41
  54. package/test/close.test.js +1 -41
  55. package/test/content-parser.test.js +69 -117
  56. package/test/custom-parser.1.test.js +40 -1
  57. package/test/decorator-namespace.test._js_ +31 -0
  58. package/test/decorator.test.js +92 -43
  59. package/test/delete.test.js +21 -1
  60. package/test/diagnostics-channel/404.test.js +57 -0
  61. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  62. package/test/diagnostics-channel/async-request.test.js +72 -0
  63. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  64. package/test/diagnostics-channel/error-request.test.js +61 -0
  65. package/test/diagnostics-channel/error-status.test.js +39 -0
  66. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  67. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  68. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  69. package/test/diagnostics-channel/sync-request.test.js +61 -0
  70. package/test/encapsulated-error-handler.test.js +201 -14
  71. package/test/esm/index.test.js +2 -12
  72. package/test/findRoute.test.js +16 -0
  73. package/test/genReqId.test.js +9 -0
  74. package/test/get.test.js +28 -0
  75. package/test/has-route.test.js +1 -1
  76. package/test/helper.js +1 -5
  77. package/test/hooks.test.js +0 -4
  78. package/test/http2/constraint.test.js +22 -1
  79. package/test/http2/plain.test.js +21 -6
  80. package/test/http2/secure.test.js +12 -1
  81. package/test/https/https.test.js +57 -0
  82. package/test/inject.test.js +1 -2
  83. package/test/internals/decorator.test.js +0 -2
  84. package/test/internals/errors.test.js +57 -17
  85. package/test/internals/handleRequest.test.js +5 -1
  86. package/test/internals/initialConfig.test.js +5 -5
  87. package/test/internals/logger.test.js +31 -2
  88. package/test/internals/reply.test.js +6 -78
  89. package/test/internals/request.test.js +13 -11
  90. package/test/listen.1.test.js +5 -15
  91. package/test/listen.5.test.js +99 -0
  92. package/test/logger/instantiation.test.js +8 -8
  93. package/test/logger/logging.test.js +4 -4
  94. package/test/logger/options.test.js +102 -21
  95. package/test/logger/response.test.js +6 -6
  96. package/test/maxRequestsPerSocket.test.js +2 -5
  97. package/test/method-missing.test.js +24 -0
  98. package/test/plugin.1.test.js +2 -4
  99. package/test/plugin.2.test.js +0 -2
  100. package/test/plugin.3.test.js +0 -2
  101. package/test/plugin.4.test.js +92 -56
  102. package/test/register.test.js +2 -4
  103. package/test/reply-earlyHints.test.js +98 -0
  104. package/test/reply-error.test.js +0 -2
  105. package/test/route-hooks.test.js +0 -1
  106. package/test/route-shorthand.test.js +60 -0
  107. package/test/schema-special-usage.test.js +1 -1
  108. package/test/server.test.js +17 -2
  109. package/test/stream.2.test.js +1 -1
  110. package/test/stream.4.test.js +0 -42
  111. package/test/stream.5.test.js +2 -2
  112. package/test/trust-proxy.test.js +33 -27
  113. package/test/types/errors.test-d.ts +0 -2
  114. package/test/types/fastify.test-d.ts +14 -12
  115. package/test/types/hooks.test-d.ts +1 -0
  116. package/test/types/import.ts +1 -0
  117. package/test/types/instance.test-d.ts +10 -51
  118. package/test/types/logger.test-d.ts +43 -6
  119. package/test/types/plugin.test-d.ts +5 -2
  120. package/test/types/register.test-d.ts +2 -2
  121. package/test/types/reply.test-d.ts +13 -12
  122. package/test/types/request.test-d.ts +19 -8
  123. package/test/types/route.test-d.ts +30 -2
  124. package/test/types/schema.test-d.ts +2 -2
  125. package/test/types/serverFactory.test-d.ts +1 -1
  126. package/test/types/type-provider.test-d.ts +59 -12
  127. package/test/types/using.test-d.ts +4 -1
  128. package/test/url-rewriting.test.js +3 -2
  129. package/test/useSemicolonDelimiter.test.js +3 -6
  130. package/test/versioned-routes.test.js +1 -1
  131. package/test/web-api.test.js +0 -6
  132. package/types/content-type-parser.d.ts +3 -3
  133. package/types/context.d.ts +0 -1
  134. package/types/errors.d.ts +1 -0
  135. package/types/hooks.d.ts +6 -6
  136. package/types/instance.d.ts +28 -41
  137. package/types/logger.d.ts +3 -3
  138. package/types/plugin.d.ts +3 -3
  139. package/types/reply.d.ts +9 -12
  140. package/types/request.d.ts +5 -3
  141. package/types/route.d.ts +31 -31
  142. package/types/schema.d.ts +3 -3
  143. package/types/serverFactory.d.ts +2 -2
  144. package/types/type-provider.d.ts +22 -12
  145. package/types/utils.d.ts +18 -23
  146. package/.c8rc.json +0 -8
  147. package/.eslintrc +0 -4
  148. package/.tap/processinfo/029eb7a1-1942-40bc-98e2-cef3b7a14b5e.json +0 -268
  149. package/.tap/processinfo/03c196c6-01c3-4268-a9b5-298dff18a873.json +0 -269
  150. package/.tap/processinfo/04bbabba-8611-4908-9092-dfa9fcc13327.json +0 -268
  151. package/.tap/processinfo/05d8a743-3edf-4e2d-ae5a-dc99d0855ba5.json +0 -272
  152. package/.tap/processinfo/07718963-36a8-4d87-82ad-366c877a5247.json +0 -268
  153. package/.tap/processinfo/08fe3bde-5814-4308-9158-cdf1e47391b7.json +0 -268
  154. package/.tap/processinfo/0a3e3fb0-eabf-4532-ae80-20434da22678.json +0 -268
  155. package/.tap/processinfo/0caf2a75-4b3a-46c4-9b41-c7e450e5e15f.json +0 -268
  156. package/.tap/processinfo/0cf35d52-e5b2-4884-bcf0-b0ab3017b689.json +0 -268
  157. package/.tap/processinfo/0e666134-5013-4ecd-9ee6-59b22716c39c.json +0 -268
  158. package/.tap/processinfo/1087b811-4ec4-4f91-92b4-a78a51a437de.json +0 -268
  159. package/.tap/processinfo/13709ed3-b68c-42cf-8472-b0c4b8a89d2b.json +0 -268
  160. package/.tap/processinfo/13ac2f18-d0e0-439f-bc86-2ff0119af857.json +0 -268
  161. package/.tap/processinfo/13e47e0e-f6e8-4381-8a42-923b661f4a4f.json +0 -268
  162. package/.tap/processinfo/143f7d43-b8e8-4666-b482-f28fb37160ee.json +0 -268
  163. package/.tap/processinfo/14f3801d-03ab-4db3-9df5-c5d47e0a8cf0.json +0 -270
  164. package/.tap/processinfo/15a07dad-4bcd-442c-95e0-30c31f2b9818.json +0 -273
  165. package/.tap/processinfo/191ad3ad-04d8-4fb9-b119-ad2811f9b925.json +0 -243
  166. package/.tap/processinfo/1b25d54b-62d3-44cd-b581-31e705522fae.json +0 -268
  167. package/.tap/processinfo/1b7cb260-f04b-4135-a4fe-093081c4706f.json +0 -268
  168. package/.tap/processinfo/1e395d63-4815-4c77-aa47-df3709cc0ef9.json +0 -268
  169. package/.tap/processinfo/1e7f6a54-3abf-4771-863a-585cba110aec.json +0 -268
  170. package/.tap/processinfo/21a15e1d-0b41-47d8-b03d-0ba130969034.json +0 -244
  171. package/.tap/processinfo/21e02016-9ecd-4983-8417-9c74d224644f.json +0 -269
  172. package/.tap/processinfo/2327d941-d0d5-4762-b386-02a9a27ad28e.json +0 -268
  173. package/.tap/processinfo/23d39204-eac9-4f57-8db4-ffa996227fbd.json +0 -268
  174. package/.tap/processinfo/2493875a-0ac6-4d53-993c-f44471fd0678.json +0 -268
  175. package/.tap/processinfo/2698669f-f1e7-4a12-a687-8d58177be2b0.json +0 -269
  176. package/.tap/processinfo/2862b053-0a3d-46d7-9381-ffcb06287609.json +0 -268
  177. package/.tap/processinfo/2ac1b8d6-ac92-40e2-a59a-7681069f487c.json +0 -268
  178. package/.tap/processinfo/2c75e5f7-c4ef-47e4-a1c4-105eef6c0fab.json +0 -242
  179. package/.tap/processinfo/2e2c45cd-718b-4e5a-bf88-f801630f2803.json +0 -268
  180. package/.tap/processinfo/2f9ca478-3e03-4cce-a0bc-fcdc86d7c316.json +0 -268
  181. package/.tap/processinfo/30e3117f-fb74-456f-8f02-527e9eb9fcc3.json +0 -268
  182. package/.tap/processinfo/332be679-63c7-4b49-8b87-ef55995ada2d.json +0 -268
  183. package/.tap/processinfo/37c36f95-07f9-4ef0-8ab4-9e107d51b605.json +0 -269
  184. package/.tap/processinfo/3874eae2-f3db-44ef-9a9f-c8169d4b2b76.json +0 -268
  185. package/.tap/processinfo/38a7c3da-a411-41d0-8993-9deefd23500d.json +0 -268
  186. package/.tap/processinfo/3a7b6dbd-e153-4ce5-b557-21fb82009983.json +0 -269
  187. package/.tap/processinfo/3c6731ec-936d-470f-b7b0-0c87b54be051.json +0 -268
  188. package/.tap/processinfo/3c850ea9-4ef0-4044-a3fd-fbadfa9d543e.json +0 -268
  189. package/.tap/processinfo/3e4e15e0-a325-46f0-be57-5fd374560b7a.json +0 -269
  190. package/.tap/processinfo/3ed868e0-887c-402a-9f22-b1fdb74b4da0.json +0 -268
  191. package/.tap/processinfo/405498d7-5854-4ce1-a7dc-06920932f26d.json +0 -268
  192. package/.tap/processinfo/40b7eb19-ae35-4490-8a11-eb91a573c590.json +0 -268
  193. package/.tap/processinfo/40bb1260-d856-4248-8939-a0a05e322041.json +0 -268
  194. package/.tap/processinfo/41252e0b-7f69-44cc-b356-dd94bcbfdb29.json +0 -268
  195. package/.tap/processinfo/418fa710-e2fd-4508-b533-c179958da464.json +0 -269
  196. package/.tap/processinfo/433ef009-63aa-48fe-8e5d-c725228fa2fc.json +0 -268
  197. package/.tap/processinfo/44bf577c-9c01-4197-bd29-2e1ae888c4d4.json +0 -268
  198. package/.tap/processinfo/458fb7f2-20b9-48a2-8853-403c9851f605.json +0 -268
  199. package/.tap/processinfo/46b9892b-bb23-4b86-b0fa-9297f08c611a.json +0 -268
  200. package/.tap/processinfo/46bd9aaf-6cf3-4bd5-b90d-e136a7299a8e.json +0 -268
  201. package/.tap/processinfo/4779aa5f-e57a-4fcc-87e2-7d0bd4fca27f.json +0 -268
  202. package/.tap/processinfo/47b73f4b-ab31-49e1-97fd-8436dbe4bdf3.json +0 -269
  203. package/.tap/processinfo/49dba52e-e0c9-445d-8e9d-6d9ebe3ce6c4.json +0 -268
  204. package/.tap/processinfo/4b1dbc61-4e65-4c56-9784-2036f369038a.json +0 -268
  205. package/.tap/processinfo/4b6f0b40-43ef-4668-83a0-e07e28509df5.json +0 -268
  206. package/.tap/processinfo/4c236f70-f532-460b-8f7a-dd973301d493.json +0 -268
  207. package/.tap/processinfo/4d92b707-a268-48b8-885b-004d3a288c41.json +0 -269
  208. package/.tap/processinfo/4ff10bae-7c97-4c0a-b712-6c0d2f8c0e8e.json +0 -270
  209. package/.tap/processinfo/50f95bd5-ae12-4d83-99f4-ae9b0690c6a8.json +0 -268
  210. package/.tap/processinfo/557e4a49-d99c-4a63-b2f2-f33d897ab874.json +0 -268
  211. package/.tap/processinfo/589fd21a-8319-4abf-8cf7-82cb4a463a4b.json +0 -269
  212. package/.tap/processinfo/5a872f3a-949f-40be-8004-d739d034255c.json +0 -272
  213. package/.tap/processinfo/5abc301a-23da-424d-891e-3afbaff9156c.json +0 -269
  214. package/.tap/processinfo/5c31614c-a766-4837-ab59-dd6977166f72.json +0 -253
  215. package/.tap/processinfo/5d1e90c8-d819-4901-b022-f9ea4cd81978.json +0 -268
  216. package/.tap/processinfo/5d283e67-f31d-4fa8-a559-a1d8e82ee046.json +0 -269
  217. package/.tap/processinfo/5df505bc-6a4b-4c41-822f-51e2d7111de8.json +0 -268
  218. package/.tap/processinfo/5eaf64a2-fbfd-40e7-b391-c30f744b2bf1.json +0 -269
  219. package/.tap/processinfo/5ef5ede0-6436-4938-8401-d32ad4bffd5d.json +0 -268
  220. package/.tap/processinfo/606f05c0-8293-41db-bc92-eea82123697f.json +0 -269
  221. package/.tap/processinfo/6446806d-6cab-4c1d-a9ed-6bccaf3c4ea9.json +0 -268
  222. package/.tap/processinfo/64da7e08-925d-444d-98de-6568c6115d8d.json +0 -269
  223. package/.tap/processinfo/6917da6d-d2dc-466a-a893-7fb7412dde96.json +0 -268
  224. package/.tap/processinfo/69bbeee0-c398-4ccf-98b3-fb625a63bab4.json +0 -268
  225. package/.tap/processinfo/6da6ea8f-3370-4703-b230-90159531f766.json +0 -268
  226. package/.tap/processinfo/6ecffe1f-3016-4c11-9294-b488baced99f.json +0 -268
  227. package/.tap/processinfo/6f23f41f-ccbd-48cb-9ab6-311db0cfb65c.json +0 -270
  228. package/.tap/processinfo/70168912-9bb2-4334-bb89-041f1764cddf.json +0 -268
  229. package/.tap/processinfo/713a674e-40e1-46b4-866e-949d57c1a9f9.json +0 -270
  230. package/.tap/processinfo/730254d4-eacb-4cdf-80f4-8da22341cde5.json +0 -268
  231. package/.tap/processinfo/7344e559-c546-416f-8f1b-0f9fe12c6f02.json +0 -268
  232. package/.tap/processinfo/7556217a-0155-448f-b4d4-bec1bb0f6040.json +0 -269
  233. package/.tap/processinfo/7572079c-166c-4c4c-85ff-89b9430b214f.json +0 -268
  234. package/.tap/processinfo/7808180f-1974-47cd-bba2-2d6b8b711d65.json +0 -273
  235. package/.tap/processinfo/796dde83-da66-4db2-8d27-d45a3627c9c7.json +0 -268
  236. package/.tap/processinfo/7979819f-3723-48be-9f55-be700e689441.json +0 -270
  237. package/.tap/processinfo/7a664d39-d7f5-42f9-89df-15563048fab6.json +0 -268
  238. package/.tap/processinfo/7b047b72-01d9-4217-857c-93341651b4b3.json +0 -269
  239. package/.tap/processinfo/7ce41af6-7961-45ae-8c6f-b6e1c5692a48.json +0 -268
  240. package/.tap/processinfo/7e1de1c6-127e-463d-9357-081ee33ef5ce.json +0 -269
  241. package/.tap/processinfo/81ac7a7f-b0c0-4ef6-82cb-c718ea84e152.json +0 -268
  242. package/.tap/processinfo/851a058f-a497-4b10-a0b7-c9182d9c4d5a.json +0 -268
  243. package/.tap/processinfo/86502974-c245-4194-ade4-d9c6fdbb757e.json +0 -268
  244. package/.tap/processinfo/86b9786f-4a98-43b8-882a-5f936b876f08.json +0 -241
  245. package/.tap/processinfo/8a3fe726-86ab-4300-8d73-7eacbbc02a05.json +0 -268
  246. package/.tap/processinfo/8adf928b-c963-4ba0-9c35-606fcbd8a2aa.json +0 -272
  247. package/.tap/processinfo/8b31a6d8-1a33-4a27-93ca-1c5b364be068.json +0 -240
  248. package/.tap/processinfo/8ec12773-6b18-49a2-8e52-874c797df965.json +0 -833
  249. package/.tap/processinfo/8edb9502-3420-42fb-a602-e5de93be2df1.json +0 -268
  250. package/.tap/processinfo/8fc572e6-9828-4f98-a49c-9e081b2193c4.json +0 -242
  251. package/.tap/processinfo/8fee2d30-c5dd-4fae-9cf2-2ef8dd0f90de.json +0 -834
  252. package/.tap/processinfo/92cc0496-5f26-4370-8212-18136b972f99.json +0 -268
  253. package/.tap/processinfo/93a3f064-3f6e-4f49-becb-f7925f2961a9.json +0 -268
  254. package/.tap/processinfo/967e3697-8310-4a19-8dd5-927ac8bd6c79.json +0 -269
  255. package/.tap/processinfo/97225e23-9d30-4287-b3f5-72bccebec50b.json +0 -268
  256. package/.tap/processinfo/9a363bc6-4e65-47e8-94ca-26a9db428fb4.json +0 -268
  257. package/.tap/processinfo/9d2fe462-57fa-43f1-b02c-d188f15de30b.json +0 -270
  258. package/.tap/processinfo/a00b6cda-feb7-4b8a-8179-4c43bc29d670.json +0 -269
  259. package/.tap/processinfo/a017cbd5-4ac7-49e1-8c77-1bf4f6e7f2a6.json +0 -271
  260. package/.tap/processinfo/a1277309-1984-48f8-b60b-f5e8639736be.json +0 -271
  261. package/.tap/processinfo/a16bf53e-4337-48ff-88fa-67f55738e0f5.json +0 -268
  262. package/.tap/processinfo/a3a9848f-440e-41bb-9b0b-568bcfee0ddc.json +0 -268
  263. package/.tap/processinfo/a468c11f-f2f1-4e92-9ba0-6d28b6569b72.json +0 -268
  264. package/.tap/processinfo/a5880465-68f1-46b3-84a5-0da389d0bc67.json +0 -268
  265. package/.tap/processinfo/a666f394-39b4-44ad-8e74-abebf74dde3b.json +0 -270
  266. package/.tap/processinfo/af09d8ca-7053-4410-b514-b22c47f5979f.json +0 -268
  267. package/.tap/processinfo/af203309-28aa-459d-a56e-d88833695521.json +0 -268
  268. package/.tap/processinfo/afa2f7b6-dcd2-4d90-bf3c-54ba8b6800eb.json +0 -268
  269. package/.tap/processinfo/b231291d-ef14-4ff0-85f9-38a73a5408f8.json +0 -268
  270. package/.tap/processinfo/b3d3f2a1-a9fc-4d88-b122-fae90248cd59.json +0 -268
  271. package/.tap/processinfo/b834bf83-26c4-403a-8e91-eb15fe4b0b5d.json +0 -268
  272. package/.tap/processinfo/b8786fd7-47df-4ac1-8d6f-2d4c7623c681.json +0 -268
  273. package/.tap/processinfo/b9758f53-7f5a-4b03-8684-8a42ad644e5a.json +0 -268
  274. package/.tap/processinfo/bd194ea2-a21a-4604-b225-ee48abf1e607.json +0 -242
  275. package/.tap/processinfo/bd7ced53-3872-43b7-ad73-3352e50b728b.json +0 -268
  276. package/.tap/processinfo/be50295b-7e50-46cd-8bf1-637bf222699c.json +0 -268
  277. package/.tap/processinfo/bec61dd9-aa52-4e6c-8e37-5c9c10e935fd.json +0 -268
  278. package/.tap/processinfo/c015adf9-1d60-447e-87b5-b2031fe55bba.json +0 -268
  279. package/.tap/processinfo/c0666afa-7f64-45bd-97fb-145df1380157.json +0 -268
  280. package/.tap/processinfo/c2c0c012-c1c0-4457-84d6-dadba8396c94.json +0 -268
  281. package/.tap/processinfo/c3dd3ecd-737b-47ce-a917-54341c7bbed3.json +0 -268
  282. package/.tap/processinfo/c41ac06d-64b8-4bb3-bf56-0551f5a48f4b.json +0 -268
  283. package/.tap/processinfo/c4235bfb-a2aa-4271-9c6b-3ceb370219b1.json +0 -268
  284. package/.tap/processinfo/c4e6f24f-288c-493c-b6f0-02924aeb6758.json +0 -270
  285. package/.tap/processinfo/c54227bb-4a7b-40bb-bfe6-b54fe55078f3.json +0 -268
  286. package/.tap/processinfo/c699de91-3b0b-4466-9418-6910a3eb640a.json +0 -269
  287. package/.tap/processinfo/c74e2f37-451a-4577-ac18-e597fbd9a1d4.json +0 -269
  288. package/.tap/processinfo/c90cccec-5b4b-445f-a935-ac22859675d0.json +0 -252
  289. package/.tap/processinfo/c9dd6c7d-0d16-45e5-87ae-117388bf2994.json +0 -268
  290. package/.tap/processinfo/ca2e48fb-58c5-47fc-ad2e-263838aea42c.json +0 -272
  291. package/.tap/processinfo/ca87351d-c710-45c1-838a-16bccac59874.json +0 -273
  292. package/.tap/processinfo/cdb4a671-5776-4944-91b9-c456c58841ef.json +0 -268
  293. package/.tap/processinfo/cf10fdc8-6a87-447a-9e12-45f447af61f3.json +0 -244
  294. package/.tap/processinfo/cf3f1f08-643e-4f24-82ca-40f7a349c3d1.json +0 -268
  295. package/.tap/processinfo/d091172a-06a5-469b-82a9-8fefe3dd99da.json +0 -240
  296. package/.tap/processinfo/d1675431-61d6-45f8-a010-6e654112a00a.json +0 -272
  297. package/.tap/processinfo/d2d54aa2-c221-4ad4-b6b7-0c58e3c3679c.json +0 -269
  298. package/.tap/processinfo/d4f3c95a-ddbe-419d-bce0-dd6acceee21f.json +0 -268
  299. package/.tap/processinfo/d54ed8f1-43c3-478a-90d3-2c8aced723f2.json +0 -269
  300. package/.tap/processinfo/d6e5a2a6-4647-4d98-916c-aec4ace54a65.json +0 -268
  301. package/.tap/processinfo/d7280c64-45e6-4b12-affc-3ac9a5d4014a.json +0 -268
  302. package/.tap/processinfo/d82c8367-d825-4405-88df-07298f6ef840.json +0 -269
  303. package/.tap/processinfo/d8f97e53-e921-4d33-9c8d-2f7e807a9425.json +0 -268
  304. package/.tap/processinfo/da546a73-9714-4f8c-bdbb-e42730edbcfa.json +0 -268
  305. package/.tap/processinfo/da7fb7fb-1da4-49f8-a3ee-d4ea623c01a5.json +0 -268
  306. package/.tap/processinfo/daa6a016-4f0c-4050-923c-2022e0bb21d8.json +0 -268
  307. package/.tap/processinfo/db9a251d-8540-4719-b464-e7d5febd97d1.json +0 -240
  308. package/.tap/processinfo/dc10c603-8e58-4611-baa3-44da2578d07a.json +0 -268
  309. package/.tap/processinfo/dde56c1a-858c-47cc-b0bb-61279620ac17.json +0 -268
  310. package/.tap/processinfo/e0d9c4ea-f7c7-4c64-8ced-66dc6f0ac5d2.json +0 -271
  311. package/.tap/processinfo/e121454f-5dfa-4209-ba15-4c39840871f2.json +0 -831
  312. package/.tap/processinfo/e1f43e40-c3fe-4eb8-a713-d5910cc6b25a.json +0 -268
  313. package/.tap/processinfo/e4575e7a-f00e-488b-94e1-8f877b54725e.json +0 -268
  314. package/.tap/processinfo/e9ad667e-8603-4488-af64-449cc9532803.json +0 -268
  315. package/.tap/processinfo/eb26a697-e5e2-4730-aeea-bcb9c49afd4d.json +0 -268
  316. package/.tap/processinfo/eb29d1c3-feaf-4744-9d84-cf257e8269b0.json +0 -268
  317. package/.tap/processinfo/ee720c0a-ed64-4e7e-8c0a-139c7b9725d2.json +0 -268
  318. package/.tap/processinfo/ef88c13a-87b2-49e4-a683-7b812505cd6f.json +0 -268
  319. package/.tap/processinfo/f4ed6948-dac0-4128-9f86-d083b6918ea7.json +0 -268
  320. package/.tap/processinfo/f7544c01-8ac7-4e42-8ad5-c4d62e094d1f.json +0 -270
  321. package/.tap/processinfo/f7cee4b3-7bcc-4591-a628-5629b0b41c9e.json +0 -268
  322. package/.tap/processinfo/f9c0a1f7-c1a4-44d3-ae3f-8c1eb42cd746.json +0 -269
  323. package/.tap/processinfo/fc46b4da-79db-4201-af7e-34bb17f92d69.json +0 -270
  324. package/.tap/processinfo/fccc0056-03c4-40cb-9d0b-2db4bbe573c1.json +0 -268
  325. package/.tap/processinfo/fd2df572-54d7-4ce7-b7aa-a2b4b00d4127.json +0 -254
  326. package/.tap/processinfo/fea9377f-b473-484d-bee6-ac7f49e50937.json +0 -269
  327. package/.tap/processinfo/feb516dc-abda-46e6-9b42-d37adfc63366.json +0 -268
  328. package/.tap/processinfo/ff0fda4c-aa2e-4236-906e-fdfb6bd6632e.json +0 -269
  329. package/.tap/test-results/test/404s.test.js.tap +0 -623
  330. package/.tap/test-results/test/500s.test.js.tap +0 -64
  331. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +0 -36
  332. package/.tap/test-results/test/als.test.js.tap +0 -15
  333. package/.tap/test-results/test/async-await.test.js.tap +0 -184
  334. package/.tap/test-results/test/async-dispose.test.js.tap +0 -8
  335. package/.tap/test-results/test/async_hooks.test.js.tap +0 -10
  336. package/.tap/test-results/test/bodyLimit.test.js.tap +0 -48
  337. package/.tap/test-results/test/buffer.test.js.tap +0 -20
  338. package/.tap/test-results/test/build/error-serializer.test.js.tap +0 -8
  339. package/.tap/test-results/test/build/version.test.js.tap +0 -7
  340. package/.tap/test-results/test/case-insensitive.test.js.tap +0 -36
  341. package/.tap/test-results/test/chainable.test.js.tap +0 -17
  342. package/.tap/test-results/test/check.test.js.tap +0 -10
  343. package/.tap/test-results/test/childLoggerFactory.test.js.tap +0 -23
  344. package/.tap/test-results/test/client-timeout.test.js.tap +0 -7
  345. package/.tap/test-results/test/close-pipelining.test.js.tap +0 -15
  346. package/.tap/test-results/test/close.test.js.tap +0 -172
  347. package/.tap/test-results/test/connectionTimeout.test.js.tap +0 -12
  348. package/.tap/test-results/test/constrained-routes.test.js.tap +0 -173
  349. package/.tap/test-results/test/content-length.test.js.tap +0 -46
  350. package/.tap/test-results/test/content-parser.test.js.tap +0 -266
  351. package/.tap/test-results/test/content-type.test.js.tap +0 -14
  352. package/.tap/test-results/test/context-config.test.js.tap +0 -41
  353. package/.tap/test-results/test/copy.test.js.tap +0 -14
  354. package/.tap/test-results/test/custom-http-server.test.js.tap +0 -30
  355. package/.tap/test-results/test/custom-parser-async.test.js.tap +0 -21
  356. package/.tap/test-results/test/custom-parser.0.test.js.tap +0 -199
  357. package/.tap/test-results/test/custom-parser.1.test.js.tap +0 -90
  358. package/.tap/test-results/test/custom-parser.2.test.js.tap +0 -22
  359. package/.tap/test-results/test/custom-parser.3.test.js.tap +0 -53
  360. package/.tap/test-results/test/custom-parser.4.test.js.tap +0 -45
  361. package/.tap/test-results/test/custom-parser.5.test.js.tap +0 -41
  362. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +0 -46
  363. package/.tap/test-results/test/decorator.test.js.tap +0 -465
  364. package/.tap/test-results/test/delete.test.js.tap +0 -110
  365. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +0 -15
  366. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +0 -25
  367. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +0 -24
  368. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +0 -9
  369. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +0 -20
  370. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +0 -10
  371. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +0 -14
  372. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +0 -16
  373. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +0 -16
  374. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +0 -19
  375. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +0 -18
  376. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +0 -243
  377. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +0 -9
  378. package/.tap/test-results/test/esm/esm.test.mjs.tap +0 -8
  379. package/.tap/test-results/test/esm/index.test.js.tap +0 -8
  380. package/.tap/test-results/test/fastify-instance.test.js.tap +0 -114
  381. package/.tap/test-results/test/findRoute.test.js.tap +0 -37
  382. package/.tap/test-results/test/fluent-schema.test.js.tap +0 -36
  383. package/.tap/test-results/test/genReqId.test.js.tap +0 -106
  384. package/.tap/test-results/test/get.test.js.tap +0 -151
  385. package/.tap/test-results/test/handler-context.test.js.tap +0 -19
  386. package/.tap/test-results/test/has-route.test.js.tap +0 -30
  387. package/.tap/test-results/test/head.test.js.tap +0 -130
  388. package/.tap/test-results/test/header-overflow.test.js.tap +0 -16
  389. package/.tap/test-results/test/hooks-async.test.js.tap +0 -286
  390. package/.tap/test-results/test/hooks.on-listen.test.js.tap +0 -311
  391. package/.tap/test-results/test/hooks.on-ready.test.js.tap +0 -151
  392. package/.tap/test-results/test/hooks.test.js.tap +0 -966
  393. package/.tap/test-results/test/http2/closing.test.js.tap +0 -35
  394. package/.tap/test-results/test/http2/constraint.test.js.tap +0 -32
  395. package/.tap/test-results/test/http2/head.test.js.tap +0 -9
  396. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +0 -8
  397. package/.tap/test-results/test/http2/plain.test.js.tap +0 -22
  398. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +0 -40
  399. package/.tap/test-results/test/http2/secure.test.js.tap +0 -27
  400. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +0 -9
  401. package/.tap/test-results/test/https/custom-https-server.test.js.tap +0 -10
  402. package/.tap/test-results/test/https/https.test.js.tap +0 -45
  403. package/.tap/test-results/test/imports.test.js.tap +0 -14
  404. package/.tap/test-results/test/inject.test.js.tap +0 -165
  405. package/.tap/test-results/test/internals/all.test.js.tap +0 -42
  406. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +0 -14
  407. package/.tap/test-results/test/internals/context.test.js.tap +0 -14
  408. package/.tap/test-results/test/internals/decorator.test.js.tap +0 -51
  409. package/.tap/test-results/test/internals/errors.test.js.tap +0 -1212
  410. package/.tap/test-results/test/internals/handleRequest.test.js.tap +0 -69
  411. package/.tap/test-results/test/internals/hookRunner.test.js.tap +0 -143
  412. package/.tap/test-results/test/internals/hooks.test.js.tap +0 -45
  413. package/.tap/test-results/test/internals/initialConfig.test.js.tap +0 -125
  414. package/.tap/test-results/test/internals/logger.test.js.tap +0 -71
  415. package/.tap/test-results/test/internals/plugin.test.js.tap +0 -48
  416. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +0 -166
  417. package/.tap/test-results/test/internals/reply.test.js.tap +0 -688
  418. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +0 -74
  419. package/.tap/test-results/test/internals/request-validate.test.js.tap +0 -384
  420. package/.tap/test-results/test/internals/request.test.js.tap +0 -163
  421. package/.tap/test-results/test/internals/server.test.js.tap +0 -30
  422. package/.tap/test-results/test/internals/validation.test.js.tap +0 -121
  423. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +0 -12
  424. package/.tap/test-results/test/listen.1.test.js.tap +0 -31
  425. package/.tap/test-results/test/listen.2.test.js.tap +0 -46
  426. package/.tap/test-results/test/listen.3.test.js.tap +0 -25
  427. package/.tap/test-results/test/listen.4.test.js.tap +0 -51
  428. package/.tap/test-results/test/lock.test.js.tap +0 -29
  429. package/.tap/test-results/test/logger/instantiation.test.js.tap +0 -92
  430. package/.tap/test-results/test/logger/logging.test.js.tap +0 -117
  431. package/.tap/test-results/test/logger/options.test.js.tap +0 -165
  432. package/.tap/test-results/test/logger/request.test.js.tap +0 -82
  433. package/.tap/test-results/test/logger/response.test.js.tap +0 -38
  434. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +0 -44
  435. package/.tap/test-results/test/method-missing.test.js.tap +0 -8
  436. package/.tap/test-results/test/middleware.test.js.tap +0 -17
  437. package/.tap/test-results/test/mkcalendar.test.js.tap +0 -43
  438. package/.tap/test-results/test/mkcol.test.js.tap +0 -14
  439. package/.tap/test-results/test/move.test.js.tap +0 -15
  440. package/.tap/test-results/test/noop-set.test.js.tap +0 -8
  441. package/.tap/test-results/test/nullable-validation.test.js.tap +0 -36
  442. package/.tap/test-results/test/options.error-handler.test.js.tap +0 -186
  443. package/.tap/test-results/test/options.test.js.tap +0 -174
  444. package/.tap/test-results/test/output-validation.test.js.tap +0 -66
  445. package/.tap/test-results/test/patch.error-handler.test.js.tap +0 -206
  446. package/.tap/test-results/test/patch.test.js.tap +0 -182
  447. package/.tap/test-results/test/plugin.1.test.js.tap +0 -78
  448. package/.tap/test-results/test/plugin.2.test.js.tap +0 -102
  449. package/.tap/test-results/test/plugin.3.test.js.tap +0 -58
  450. package/.tap/test-results/test/plugin.4.test.js.tap +0 -164
  451. package/.tap/test-results/test/post-empty-body.test.js.tap +0 -8
  452. package/.tap/test-results/test/pretty-print.test.js.tap +0 -82
  453. package/.tap/test-results/test/promises.test.js.tap +0 -46
  454. package/.tap/test-results/test/propfind.test.js.tap +0 -43
  455. package/.tap/test-results/test/proppatch.test.js.tap +0 -29
  456. package/.tap/test-results/test/proto-poisoning.test.js.tap +0 -47
  457. package/.tap/test-results/test/put.error-handler.test.js.tap +0 -206
  458. package/.tap/test-results/test/put.test.js.tap +0 -182
  459. package/.tap/test-results/test/register.test.js.tap +0 -61
  460. package/.tap/test-results/test/reply-code.test.js.tap +0 -40
  461. package/.tap/test-results/test/reply-earlyHints.test.js.tap +0 -22
  462. package/.tap/test-results/test/reply-error.test.js.tap +0 -643
  463. package/.tap/test-results/test/reply-trailers.test.js.tap +0 -176
  464. package/.tap/test-results/test/report.test.js.tap +0 -43
  465. package/.tap/test-results/test/request-error.test.js.tap +0 -98
  466. package/.tap/test-results/test/request-id.test.js.tap +0 -38
  467. package/.tap/test-results/test/request.deprecated.test.js.tap +0 -13
  468. package/.tap/test-results/test/requestTimeout.test.js.tap +0 -21
  469. package/.tap/test-results/test/route-hooks.test.js.tap +0 -498
  470. package/.tap/test-results/test/route-prefix.test.js.tap +0 -195
  471. package/.tap/test-results/test/route-shorthand.test.js.tap +0 -190
  472. package/.tap/test-results/test/route.1.test.js.tap +0 -93
  473. package/.tap/test-results/test/route.2.test.js.tap +0 -28
  474. package/.tap/test-results/test/route.3.test.js.tap +0 -39
  475. package/.tap/test-results/test/route.4.test.js.tap +0 -32
  476. package/.tap/test-results/test/route.5.test.js.tap +0 -54
  477. package/.tap/test-results/test/route.6.test.js.tap +0 -81
  478. package/.tap/test-results/test/route.7.test.js.tap +0 -93
  479. package/.tap/test-results/test/route.8.test.js.tap +0 -38
  480. package/.tap/test-results/test/router-options.test.js.tap +0 -104
  481. package/.tap/test-results/test/same-shape.test.js.tap +0 -22
  482. package/.tap/test-results/test/schema-examples.test.js.tap +0 -85
  483. package/.tap/test-results/test/schema-feature.test.js.tap +0 -445
  484. package/.tap/test-results/test/schema-serialization.test.js.tap +0 -194
  485. package/.tap/test-results/test/schema-special-usage.test.js.tap +0 -186
  486. package/.tap/test-results/test/schema-validation.test.js.tap +0 -199
  487. package/.tap/test-results/test/search.test.js.tap +0 -77
  488. package/.tap/test-results/test/serialize-response.test.js.tap +0 -26
  489. package/.tap/test-results/test/server.test.js.tap +0 -65
  490. package/.tap/test-results/test/set-error-handler.test.js.tap +0 -7
  491. package/.tap/test-results/test/skip-reply-send.test.js.tap +0 -272
  492. package/.tap/test-results/test/stream.1.test.js.tap +0 -36
  493. package/.tap/test-results/test/stream.2.test.js.tap +0 -20
  494. package/.tap/test-results/test/stream.3.test.js.tap +0 -34
  495. package/.tap/test-results/test/stream.4.test.js.tap +0 -40
  496. package/.tap/test-results/test/stream.5.test.js.tap +0 -37
  497. package/.tap/test-results/test/sync-routes.test.js.tap +0 -19
  498. package/.tap/test-results/test/throw.test.js.tap +0 -116
  499. package/.tap/test-results/test/trace.test.js.tap +0 -7
  500. package/.tap/test-results/test/trust-proxy.test.js.tap +0 -109
  501. package/.tap/test-results/test/type-provider.test.js.tap +0 -12
  502. package/.tap/test-results/test/unlock.test.js.tap +0 -14
  503. package/.tap/test-results/test/upgrade.test.js.tap +0 -8
  504. package/.tap/test-results/test/url-rewriting.test.js.tap +0 -39
  505. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +0 -33
  506. package/.tap/test-results/test/validation-error-handling.test.js.tap +0 -180
  507. package/.tap/test-results/test/versioned-routes.test.js.tap +0 -151
  508. package/.tap/test-results/test/web-api.test.js.tap +0 -51
  509. package/.tap/test-results/test/wrapThenable.test.js.tap +0 -11
  510. package/EXPENSE_POLICY.md +0 -105
  511. package/test/default-route.test.js +0 -88
  512. package/test/listen.deprecated.test.js +0 -229
  513. package/test/unsupported-httpversion.test.js +0 -31
  514. package/types/.eslintrc.json +0 -48
@@ -12,19 +12,20 @@ const third = function (req, payload, done) {}
12
12
 
13
13
  test('hasContentTypeParser', t => {
14
14
  test('should know about internal parsers', t => {
15
- t.plan(4)
15
+ t.plan(5)
16
16
 
17
17
  const fastify = Fastify()
18
18
  fastify.ready(err => {
19
19
  t.error(err)
20
20
  t.ok(fastify.hasContentTypeParser('application/json'))
21
21
  t.ok(fastify.hasContentTypeParser('text/plain'))
22
+ t.ok(fastify.hasContentTypeParser(' text/plain '))
22
23
  t.notOk(fastify.hasContentTypeParser('application/jsoff'))
23
24
  })
24
25
  })
25
26
 
26
- test('should work with string and RegExp', t => {
27
- t.plan(7)
27
+ test('should only work with string and RegExp', t => {
28
+ t.plan(8)
28
29
 
29
30
  const fastify = Fastify()
30
31
  fastify.addContentTypeParser(/^image\/.*/, first)
@@ -38,6 +39,7 @@ test('hasContentTypeParser', t => {
38
39
  t.notOk(fastify.hasContentTypeParser(/^image\/.+\+xml/))
39
40
  t.notOk(fastify.hasContentTypeParser('image/png'))
40
41
  t.notOk(fastify.hasContentTypeParser('*'))
42
+ t.throws(() => fastify.hasContentTypeParser(123), FST_ERR_CTP_INVALID_TYPE)
41
43
  })
42
44
 
43
45
  t.end()
@@ -45,7 +47,7 @@ test('hasContentTypeParser', t => {
45
47
 
46
48
  test('getParser', t => {
47
49
  test('should return matching parser', t => {
48
- t.plan(3)
50
+ t.plan(6)
49
51
 
50
52
  const fastify = Fastify()
51
53
 
@@ -56,9 +58,12 @@ test('getParser', t => {
56
58
  t.equal(fastify[keys.kContentTypeParser].getParser('application/t+xml').fn, second)
57
59
  t.equal(fastify[keys.kContentTypeParser].getParser('image/png').fn, first)
58
60
  t.equal(fastify[keys.kContentTypeParser].getParser('text/html').fn, third)
61
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/html; charset=utf-8').fn, third)
62
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/html ; charset=utf-8').fn, third)
63
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/htmlINVALID')?.fn, undefined)
59
64
  })
60
65
 
61
- test('should return matching parser with caching', t => {
66
+ test('should return matching parser with caching /1', t => {
62
67
  t.plan(6)
63
68
 
64
69
  const fastify = Fastify()
@@ -73,6 +78,21 @@ test('getParser', t => {
73
78
  t.equal(fastify[keys.kContentTypeParser].cache.size, 1)
74
79
  })
75
80
 
81
+ test('should return matching parser with caching /2', t => {
82
+ t.plan(6)
83
+
84
+ const fastify = Fastify()
85
+
86
+ fastify.addContentTypeParser(/^text\/html(;\s*charset=[^;]+)?$/, first)
87
+
88
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/html').fn, first)
89
+ t.equal(fastify[keys.kContentTypeParser].cache.size, 1)
90
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/html;charset=utf-8').fn, first)
91
+ t.equal(fastify[keys.kContentTypeParser].cache.size, 2)
92
+ t.equal(fastify[keys.kContentTypeParser].getParser('text/html;charset=utf-8').fn, first)
93
+ t.equal(fastify[keys.kContentTypeParser].cache.size, 2)
94
+ })
95
+
76
96
  test('should prefer content type parser with string value', t => {
77
97
  t.plan(2)
78
98
 
@@ -199,6 +219,36 @@ test('add', t => {
199
219
  t.equal(contentTypeParser.customParsers.get('').fn, first)
200
220
  })
201
221
 
222
+ test('should lowercase contentTypeParser name', async t => {
223
+ t.plan(1)
224
+ const fastify = Fastify()
225
+ fastify.addContentTypeParser('text/html', function (req, done) {
226
+ done()
227
+ })
228
+ try {
229
+ fastify.addContentTypeParser('TEXT/html', function (req, done) {
230
+ done()
231
+ })
232
+ } catch (err) {
233
+ t.same(err.message, FST_ERR_CTP_ALREADY_PRESENT('text/html').message)
234
+ }
235
+ })
236
+
237
+ test('should trim contentTypeParser name', async t => {
238
+ t.plan(1)
239
+ const fastify = Fastify()
240
+ fastify.addContentTypeParser('text/html', function (req, done) {
241
+ done()
242
+ })
243
+ try {
244
+ fastify.addContentTypeParser(' text/html', function (req, done) {
245
+ done()
246
+ })
247
+ } catch (err) {
248
+ t.same(err.message, FST_ERR_CTP_ALREADY_PRESENT('text/html').message)
249
+ }
250
+ })
251
+
202
252
  t.end()
203
253
  })
204
254
 
@@ -256,7 +306,7 @@ test('Error thrown 415 from content type is null and make post request to server
256
306
 
257
307
  test('remove', t => {
258
308
  test('should remove default parser', t => {
259
- t.plan(3)
309
+ t.plan(6)
260
310
 
261
311
  const fastify = Fastify()
262
312
  const contentTypeParser = fastify[keys.kContentTypeParser]
@@ -264,6 +314,9 @@ test('remove', t => {
264
314
  t.ok(contentTypeParser.remove('application/json'))
265
315
  t.notOk(contentTypeParser.customParsers['application/json'])
266
316
  t.notOk(contentTypeParser.parserList.find(parser => parser === 'application/json'))
317
+ t.ok(contentTypeParser.remove(' text/plain '))
318
+ t.notOk(contentTypeParser.customParsers['text/plain'])
319
+ t.notOk(contentTypeParser.parserList.find(parser => parser === 'text/plain'))
267
320
  })
268
321
 
269
322
  test('should remove RegExp parser', t => {
@@ -421,32 +474,25 @@ test('Safeguard against content-type spoofing - string', async t => {
421
474
  })
422
475
  })
423
476
 
424
- test('Safeguard against content-type spoofing - regexp', async t => {
425
- t.plan(1)
477
+ test('Warning against improper content-type - regexp', t => {
478
+ t.plan(2)
426
479
 
427
480
  const fastify = Fastify()
481
+
482
+ process.on('warning', onWarning)
483
+ function onWarning (warning) {
484
+ t.equal(warning.name, 'FastifySecurity')
485
+ t.equal(warning.code, 'FSTSEC001')
486
+ }
487
+ t.teardown(() => process.removeListener('warning', onWarning))
488
+
428
489
  fastify.removeAllContentTypeParsers()
429
490
  fastify.addContentTypeParser(/text\/plain/, function (request, body, done) {
430
- t.pass('should be called')
431
491
  done(null, body)
432
492
  })
433
493
  fastify.addContentTypeParser(/application\/json/, function (request, body, done) {
434
- t.fail('shouldn\'t be called')
435
494
  done(null, body)
436
495
  })
437
-
438
- fastify.post('/', async () => {
439
- return 'ok'
440
- })
441
-
442
- await fastify.inject({
443
- method: 'POST',
444
- path: '/',
445
- headers: {
446
- 'content-type': 'text/plain; content-type="application/json"'
447
- },
448
- body: ''
449
- })
450
496
  })
451
497
 
452
498
  test('content-type match parameters - string 1', async t => {
@@ -477,34 +523,6 @@ test('content-type match parameters - string 1', async t => {
477
523
  })
478
524
  })
479
525
 
480
- test('content-type match parameters - string 2', async t => {
481
- t.plan(1)
482
-
483
- const fastify = Fastify()
484
- fastify.removeAllContentTypeParsers()
485
- fastify.addContentTypeParser('application/json; charset=utf8; foo=bar', function (request, body, done) {
486
- t.pass('should be called')
487
- done(null, body)
488
- })
489
- fastify.addContentTypeParser('text/plain; charset=utf8; foo=bar', function (request, body, done) {
490
- t.fail('shouldn\'t be called')
491
- done(null, body)
492
- })
493
-
494
- fastify.post('/', async () => {
495
- return 'ok'
496
- })
497
-
498
- await fastify.inject({
499
- method: 'POST',
500
- path: '/',
501
- headers: {
502
- 'content-type': 'application/json; foo=bar; charset=utf8'
503
- },
504
- body: ''
505
- })
506
- })
507
-
508
526
  test('content-type match parameters - regexp', async t => {
509
527
  t.plan(1)
510
528
 
@@ -650,72 +668,6 @@ test('content-type regexp list should be cloned when plugin override', async t =
650
668
  }
651
669
  })
652
670
 
653
- test('allow partial content-type - essence check', async t => {
654
- t.plan(1)
655
-
656
- const fastify = Fastify()
657
- fastify.removeAllContentTypeParsers()
658
- fastify.addContentTypeParser('json', function (request, body, done) {
659
- t.pass('should be called')
660
- done(null, body)
661
- })
662
-
663
- fastify.post('/', async () => {
664
- return 'ok'
665
- })
666
-
667
- await fastify.inject({
668
- method: 'POST',
669
- path: '/',
670
- headers: {
671
- 'content-type': 'application/json; foo=bar; charset=utf8'
672
- },
673
- body: ''
674
- })
675
-
676
- await fastify.inject({
677
- method: 'POST',
678
- path: '/',
679
- headers: {
680
- 'content-type': 'image/jpeg'
681
- },
682
- body: ''
683
- })
684
- })
685
-
686
- test('allow partial content-type - not essence check', async t => {
687
- t.plan(1)
688
-
689
- const fastify = Fastify()
690
- fastify.removeAllContentTypeParsers()
691
- fastify.addContentTypeParser('json;', function (request, body, done) {
692
- t.pass('should be called')
693
- done(null, body)
694
- })
695
-
696
- fastify.post('/', async () => {
697
- return 'ok'
698
- })
699
-
700
- await fastify.inject({
701
- method: 'POST',
702
- path: '/',
703
- headers: {
704
- 'content-type': 'application/json; foo=bar; charset=utf8'
705
- },
706
- body: ''
707
- })
708
-
709
- await fastify.inject({
710
- method: 'POST',
711
- path: '/',
712
- headers: {
713
- 'content-type': 'image/jpeg'
714
- },
715
- body: ''
716
- })
717
- })
718
-
719
671
  test('edge case content-type - ;', async t => {
720
672
  t.plan(1)
721
673
 
@@ -63,7 +63,7 @@ test('Should have typeof body object with no custom parser defined, undefined bo
63
63
  })
64
64
  })
65
65
 
66
- test('Should get the body as string', t => {
66
+ test('Should get the body as string /1', t => {
67
67
  t.plan(6)
68
68
  const fastify = Fastify()
69
69
 
@@ -102,6 +102,45 @@ test('Should get the body as string', t => {
102
102
  })
103
103
  })
104
104
 
105
+ test('Should get the body as string /2', t => {
106
+ t.plan(6)
107
+ const fastify = Fastify()
108
+
109
+ fastify.post('/', (req, reply) => {
110
+ reply.send(req.body)
111
+ })
112
+
113
+ fastify.addContentTypeParser('text/plain/test', { parseAs: 'string' }, function (req, body, done) {
114
+ t.ok('called')
115
+ t.ok(typeof body === 'string')
116
+ try {
117
+ const plainText = body
118
+ done(null, plainText)
119
+ } catch (err) {
120
+ err.statusCode = 400
121
+ done(err, undefined)
122
+ }
123
+ })
124
+
125
+ fastify.listen({ port: 0 }, err => {
126
+ t.error(err)
127
+
128
+ sget({
129
+ method: 'POST',
130
+ url: getServerUrl(fastify),
131
+ body: 'hello world',
132
+ headers: {
133
+ 'Content-Type': ' text/plain/test '
134
+ }
135
+ }, (err, response, body) => {
136
+ t.error(err)
137
+ t.equal(response.statusCode, 200)
138
+ t.equal(body.toString(), 'hello world')
139
+ fastify.close()
140
+ })
141
+ })
142
+ })
143
+
105
144
  test('Should get the body as buffer', t => {
106
145
  t.plan(6)
107
146
  const fastify = Fastify()
@@ -0,0 +1,31 @@
1
+ 'use strict'
2
+
3
+ /* eslint no-prototype-builtins: 0 */
4
+
5
+ const t = require('tap')
6
+ const test = t.test
7
+ const Fastify = require('..')
8
+ const fp = require('fastify-plugin')
9
+
10
+ test('plugin namespace', async t => {
11
+ t.plan(2)
12
+ const app = Fastify()
13
+
14
+ await app.register(async function plugin (app, opts) {
15
+ app.decorate('utility', function () {
16
+ return 'utility'
17
+ })
18
+
19
+ app.get('/', function (req, reply) {
20
+ // ! here the plugin would use app.utility()
21
+ // ! the plugin does not know about the namespace
22
+ reply.send({ utility: app.utility() })
23
+ })
24
+ }, { namepace: 'foo' })
25
+
26
+ // ! but outside the plugin the decorator would be app.foo.utility()
27
+ t.ok(app.foo.utility)
28
+
29
+ const res = await app.inject('/')
30
+ t.same(res.json(), { utility: 'utility' })
31
+ })
@@ -1,14 +1,11 @@
1
1
  'use strict'
2
2
 
3
- /* eslint no-prototype-builtins: 0 */
4
-
5
3
  const t = require('tap')
6
4
  const test = t.test
7
5
  const Fastify = require('..')
8
6
  const fp = require('fastify-plugin')
9
7
  const sget = require('simple-get').concat
10
8
  const symbols = require('../lib/symbols.js')
11
- const proxyquire = require('proxyquire')
12
9
 
13
10
  test('server methods should exist', t => {
14
11
  t.plan(2)
@@ -789,49 +786,44 @@ test('decorate* should throw if called after ready', async t => {
789
786
  await fastify.close()
790
787
  })
791
788
 
792
- test('decorate* should emit warning if an array is passed', t => {
793
- t.plan(1)
789
+ test('decorate* should emit error if an array is passed', t => {
790
+ t.plan(2)
794
791
 
795
- function onWarning (name) {
796
- t.equal(name, 'test_array')
792
+ const fastify = Fastify()
793
+ try {
794
+ fastify.decorateRequest('test_array', [])
795
+ t.fail('should not decorate')
796
+ } catch (err) {
797
+ t.same(err.code, 'FST_ERR_DEC_REFERENCE_TYPE')
798
+ t.same(err.message, "The decorator 'test_array' of type 'object' is a reference type. Use the { getter, setter } interface instead.")
797
799
  }
800
+ })
798
801
 
799
- const decorate = proxyquire('../lib/decorate', {
800
- './warnings': {
801
- FSTDEP006: onWarning
802
- }
803
- })
804
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
805
- fastify.decorateRequest('test_array', [])
802
+ test('server.decorate should not emit error if reference type is passed', async t => {
803
+ t.plan(1)
804
+
805
+ const fastify = Fastify()
806
+ fastify.decorate('test_array', [])
807
+ fastify.decorate('test_object', {})
808
+ await fastify.ready()
809
+ t.pass('Done')
806
810
  })
807
811
 
808
812
  test('decorate* should emit warning if object type is passed', t => {
809
- t.plan(1)
813
+ t.plan(2)
810
814
 
811
- function onWarning (name) {
812
- t.equal(name, 'test_object')
815
+ const fastify = Fastify()
816
+ try {
817
+ fastify.decorateRequest('test_object', { foo: 'bar' })
818
+ t.fail('should not decorate')
819
+ } catch (err) {
820
+ t.same(err.code, 'FST_ERR_DEC_REFERENCE_TYPE')
821
+ t.same(err.message, "The decorator 'test_object' of type 'object' is a reference type. Use the { getter, setter } interface instead.")
813
822
  }
814
-
815
- const decorate = proxyquire('../lib/decorate', {
816
- './warnings': {
817
- FSTDEP006: onWarning
818
- }
819
- })
820
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
821
- fastify.decorateRequest('test_object', { foo: 'bar' })
822
823
  })
823
824
 
824
825
  test('decorate* should not emit warning if object with getter/setter is passed', t => {
825
- function onWarning (warning) {
826
- t.fail('Should not call a warn')
827
- }
828
-
829
- const decorate = proxyquire('../lib/decorate', {
830
- './warnings': {
831
- FSTDEP006: onWarning
832
- }
833
- })
834
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
826
+ const fastify = Fastify()
835
827
 
836
828
  fastify.decorateRequest('test_getter_setter', {
837
829
  setter (val) {
@@ -844,17 +836,74 @@ test('decorate* should not emit warning if object with getter/setter is passed',
844
836
  t.end('Done')
845
837
  })
846
838
 
847
- test('decorate* should not emit warning if string,bool,numbers are passed', t => {
848
- function onWarning (warning) {
849
- t.fail('Should not call a warn')
850
- }
839
+ test('decorateRequest with getter/setter can handle encapsulation', async t => {
840
+ t.plan(24)
841
+
842
+ const fastify = Fastify({ logger: true })
843
+
844
+ fastify.decorateRequest('test_getter_setter_holder')
845
+ fastify.decorateRequest('test_getter_setter', {
846
+ getter () {
847
+ this.test_getter_setter_holder ??= {}
848
+ return this.test_getter_setter_holder
849
+ }
850
+ })
851
+
852
+ fastify.get('/', async function (req, reply) {
853
+ t.same(req.test_getter_setter, {}, 'a getter')
854
+ req.test_getter_setter.a = req.id
855
+ t.same(req.test_getter_setter, { a: req.id })
856
+ })
857
+
858
+ fastify.addHook('onResponse', async function hook (req, reply) {
859
+ t.same(req.test_getter_setter, { a: req.id })
860
+ })
851
861
 
852
- const decorate = proxyquire('../lib/decorate', {
853
- './warnings': {
854
- FSTDEP006: onWarning
862
+ await Promise.all([
863
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
864
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
865
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
866
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
867
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
868
+ fastify.inject('/').then(res => t.same(res.statusCode, 200))
869
+ ])
870
+ })
871
+
872
+ test('decorateRequest with getter/setter can handle encapsulation with arrays', async t => {
873
+ t.plan(24)
874
+
875
+ const fastify = Fastify({ logger: true })
876
+
877
+ fastify.decorateRequest('array_holder')
878
+ fastify.decorateRequest('my_array', {
879
+ getter () {
880
+ this.array_holder ??= []
881
+ return this.array_holder
855
882
  }
856
883
  })
857
- const fastify = proxyquire('..', { './lib/decorate.js': decorate })()
884
+
885
+ fastify.get('/', async function (req, reply) {
886
+ t.same(req.my_array, [])
887
+ req.my_array.push(req.id)
888
+ t.same(req.my_array, [req.id])
889
+ })
890
+
891
+ fastify.addHook('onResponse', async function hook (req, reply) {
892
+ t.same(req.my_array, [req.id])
893
+ })
894
+
895
+ await Promise.all([
896
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
897
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
898
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
899
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
900
+ fastify.inject('/').then(res => t.same(res.statusCode, 200)),
901
+ fastify.inject('/').then(res => t.same(res.statusCode, 200))
902
+ ])
903
+ })
904
+
905
+ test('decorate* should not emit error if string,bool,numbers are passed', t => {
906
+ const fastify = Fastify()
858
907
 
859
908
  fastify.decorateRequest('test_str', 'foo')
860
909
  fastify.decorateRequest('test_bool', true)
@@ -300,8 +300,28 @@ fastify.listen({ port: 0 }, err => {
300
300
  })
301
301
  })
302
302
 
303
+ test('shorthand - delete with application/json Content-Type header and null body', t => {
304
+ t.plan(4)
305
+ const fastify = require('..')()
306
+ fastify.delete('/', {}, (req, reply) => {
307
+ t.equal(req.body, null)
308
+ reply.send(req.body)
309
+ })
310
+ fastify.inject({
311
+ method: 'DELETE',
312
+ url: '/',
313
+ headers: { 'Content-Type': 'application/json' },
314
+ body: 'null'
315
+ }, (err, response) => {
316
+ t.error(err)
317
+ t.equal(response.statusCode, 200)
318
+ t.same(response.payload.toString(), 'null')
319
+ })
320
+ })
321
+
303
322
  // https://github.com/fastify/fastify/issues/936
304
- test('shorthand - delete with application/json Content-Type header and without body', t => {
323
+ // Skip this test because this is an invalid request
324
+ test('shorthand - delete with application/json Content-Type header and without body', { skip: 'https://github.com/fastify/fastify/pull/5419' }, t => {
305
325
  t.plan(4)
306
326
  const fastify = require('..')()
307
327
  fastify.delete('/', {}, (req, reply) => {
@@ -0,0 +1,57 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const diagnostics = require('dc-polyfill')
5
+ const test = t.test
6
+ const sget = require('simple-get').concat
7
+ const Fastify = require('../..')
8
+ const { getServerUrl } = require('../helper')
9
+ const Request = require('../../lib/request')
10
+ const Reply = require('../../lib/reply')
11
+
12
+ test('diagnostics channel sync events fire in expected order', t => {
13
+ t.plan(9)
14
+ let callOrder = 0
15
+ let firstEncounteredMessage
16
+
17
+ diagnostics.subscribe('tracing:fastify.request.handler:start', (msg) => {
18
+ t.equal(callOrder++, 0)
19
+ firstEncounteredMessage = msg
20
+ t.ok(msg.request instanceof Request)
21
+ t.ok(msg.reply instanceof Reply)
22
+ })
23
+
24
+ diagnostics.subscribe('tracing:fastify.request.handler:end', (msg) => {
25
+ t.ok(msg.request instanceof Request)
26
+ t.ok(msg.reply instanceof Reply)
27
+ t.equal(callOrder++, 1)
28
+ t.equal(msg, firstEncounteredMessage)
29
+ })
30
+
31
+ diagnostics.subscribe('tracing:fastify.request.handler:error', (msg) => {
32
+ t.fail('should not trigger error channel')
33
+ })
34
+
35
+ const fastify = Fastify()
36
+ fastify.route({
37
+ method: 'GET',
38
+ url: '/',
39
+ handler: function (req, reply) {
40
+ reply.callNotFound()
41
+ }
42
+ })
43
+
44
+ fastify.listen({ port: 0 }, function (err) {
45
+ if (err) t.error(err)
46
+
47
+ t.teardown(() => { fastify.close() })
48
+
49
+ sget({
50
+ method: 'GET',
51
+ url: getServerUrl(fastify) + '/'
52
+ }, (err, response, body) => {
53
+ t.error(err)
54
+ t.equal(response.statusCode, 404)
55
+ })
56
+ })
57
+ })