node-fastify 5.8.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 (354) hide show
  1. package/.borp.yaml +3 -0
  2. package/.markdownlint-cli2.yaml +22 -0
  3. package/.prettierignore +1 -0
  4. package/GOVERNANCE.md +4 -0
  5. package/LICENSE +21 -0
  6. package/PROJECT_CHARTER.md +126 -0
  7. package/README.md +423 -0
  8. package/SECURITY.md +220 -0
  9. package/SPONSORS.md +24 -0
  10. package/build/build-error-serializer.js +35 -0
  11. package/build/build-validation.js +169 -0
  12. package/build/sync-version.js +11 -0
  13. package/docs/Guides/Benchmarking.md +60 -0
  14. package/docs/Guides/Database.md +321 -0
  15. package/docs/Guides/Delay-Accepting-Requests.md +608 -0
  16. package/docs/Guides/Detecting-When-Clients-Abort.md +172 -0
  17. package/docs/Guides/Ecosystem.md +726 -0
  18. package/docs/Guides/Fluent-Schema.md +127 -0
  19. package/docs/Guides/Getting-Started.md +620 -0
  20. package/docs/Guides/Index.md +43 -0
  21. package/docs/Guides/Migration-Guide-V3.md +287 -0
  22. package/docs/Guides/Migration-Guide-V4.md +267 -0
  23. package/docs/Guides/Migration-Guide-V5.md +727 -0
  24. package/docs/Guides/Plugins-Guide.md +520 -0
  25. package/docs/Guides/Prototype-Poisoning.md +383 -0
  26. package/docs/Guides/Recommendations.md +378 -0
  27. package/docs/Guides/Serverless.md +604 -0
  28. package/docs/Guides/Style-Guide.md +246 -0
  29. package/docs/Guides/Testing.md +481 -0
  30. package/docs/Guides/Write-Plugin.md +103 -0
  31. package/docs/Guides/Write-Type-Provider.md +34 -0
  32. package/docs/Reference/ContentTypeParser.md +271 -0
  33. package/docs/Reference/Decorators.md +436 -0
  34. package/docs/Reference/Encapsulation.md +194 -0
  35. package/docs/Reference/Errors.md +377 -0
  36. package/docs/Reference/HTTP2.md +94 -0
  37. package/docs/Reference/Hooks.md +958 -0
  38. package/docs/Reference/Index.md +73 -0
  39. package/docs/Reference/LTS.md +86 -0
  40. package/docs/Reference/Lifecycle.md +99 -0
  41. package/docs/Reference/Logging.md +268 -0
  42. package/docs/Reference/Middleware.md +79 -0
  43. package/docs/Reference/Plugins.md +245 -0
  44. package/docs/Reference/Principles.md +73 -0
  45. package/docs/Reference/Reply.md +1001 -0
  46. package/docs/Reference/Request.md +295 -0
  47. package/docs/Reference/Routes.md +802 -0
  48. package/docs/Reference/Server.md +2389 -0
  49. package/docs/Reference/Type-Providers.md +256 -0
  50. package/docs/Reference/TypeScript.md +1729 -0
  51. package/docs/Reference/Validation-and-Serialization.md +1130 -0
  52. package/docs/Reference/Warnings.md +58 -0
  53. package/docs/index.md +24 -0
  54. package/docs/resources/encapsulation_context.drawio +1 -0
  55. package/docs/resources/encapsulation_context.svg +3 -0
  56. package/eslint.config.js +35 -0
  57. package/examples/asyncawait.js +38 -0
  58. package/examples/benchmark/body.json +3 -0
  59. package/examples/benchmark/hooks-benchmark-async-await.js +44 -0
  60. package/examples/benchmark/hooks-benchmark.js +52 -0
  61. package/examples/benchmark/parser.js +47 -0
  62. package/examples/benchmark/simple.js +30 -0
  63. package/examples/benchmark/webstream.js +27 -0
  64. package/examples/hooks.js +91 -0
  65. package/examples/http2.js +39 -0
  66. package/examples/https.js +38 -0
  67. package/examples/parser.js +53 -0
  68. package/examples/plugin.js +12 -0
  69. package/examples/route-prefix.js +38 -0
  70. package/examples/shared-schema.js +38 -0
  71. package/examples/simple-stream.js +20 -0
  72. package/examples/simple.js +32 -0
  73. package/examples/simple.mjs +27 -0
  74. package/examples/typescript-server.ts +79 -0
  75. package/examples/use-plugin.js +29 -0
  76. package/fastify.d.ts +253 -0
  77. package/fastify.js +985 -0
  78. package/integration/server.js +29 -0
  79. package/integration/test.sh +23 -0
  80. package/lib/config-validator.js +1266 -0
  81. package/lib/content-type-parser.js +413 -0
  82. package/lib/content-type.js +160 -0
  83. package/lib/context.js +98 -0
  84. package/lib/decorate.js +152 -0
  85. package/lib/error-handler.js +173 -0
  86. package/lib/error-serializer.js +134 -0
  87. package/lib/error-status.js +14 -0
  88. package/lib/errors.js +516 -0
  89. package/lib/four-oh-four.js +190 -0
  90. package/lib/handle-request.js +195 -0
  91. package/lib/head-route.js +45 -0
  92. package/lib/hooks.js +429 -0
  93. package/lib/initial-config-validation.js +37 -0
  94. package/lib/logger-factory.js +136 -0
  95. package/lib/logger-pino.js +68 -0
  96. package/lib/noop-set.js +10 -0
  97. package/lib/plugin-override.js +90 -0
  98. package/lib/plugin-utils.js +169 -0
  99. package/lib/promise.js +23 -0
  100. package/lib/reply.js +1030 -0
  101. package/lib/req-id-gen-factory.js +52 -0
  102. package/lib/request.js +391 -0
  103. package/lib/route.js +686 -0
  104. package/lib/schema-controller.js +164 -0
  105. package/lib/schemas.js +207 -0
  106. package/lib/server.js +441 -0
  107. package/lib/symbols.js +71 -0
  108. package/lib/validation.js +280 -0
  109. package/lib/warnings.js +57 -0
  110. package/lib/wrap-thenable.js +84 -0
  111. package/package.json +225 -0
  112. package/scripts/validate-ecosystem-links.js +179 -0
  113. package/test/404s.test.js +2035 -0
  114. package/test/500s.test.js +422 -0
  115. package/test/allow-unsafe-regex.test.js +92 -0
  116. package/test/als.test.js +65 -0
  117. package/test/async-await.test.js +705 -0
  118. package/test/async-dispose.test.js +20 -0
  119. package/test/async_hooks.test.js +52 -0
  120. package/test/body-limit.test.js +224 -0
  121. package/test/buffer.test.js +74 -0
  122. package/test/build/error-serializer.test.js +36 -0
  123. package/test/build/version.test.js +14 -0
  124. package/test/build-certificate.js +109 -0
  125. package/test/bundler/README.md +29 -0
  126. package/test/bundler/esbuild/bundler-test.js +32 -0
  127. package/test/bundler/esbuild/package.json +10 -0
  128. package/test/bundler/esbuild/src/fail-plugin-version.js +14 -0
  129. package/test/bundler/esbuild/src/index.js +9 -0
  130. package/test/bundler/webpack/bundler-test.js +32 -0
  131. package/test/bundler/webpack/package.json +11 -0
  132. package/test/bundler/webpack/src/fail-plugin-version.js +14 -0
  133. package/test/bundler/webpack/src/index.js +9 -0
  134. package/test/bundler/webpack/webpack.config.js +15 -0
  135. package/test/case-insensitive.test.js +102 -0
  136. package/test/chainable.test.js +40 -0
  137. package/test/child-logger-factory.test.js +128 -0
  138. package/test/client-timeout.test.js +38 -0
  139. package/test/close-pipelining.test.js +78 -0
  140. package/test/close.test.js +706 -0
  141. package/test/conditional-pino.test.js +47 -0
  142. package/test/connection-timeout.test.js +42 -0
  143. package/test/constrained-routes.test.js +1138 -0
  144. package/test/content-length.test.js +174 -0
  145. package/test/content-parser.test.js +739 -0
  146. package/test/content-type.test.js +181 -0
  147. package/test/context-config.test.js +164 -0
  148. package/test/custom-http-server.test.js +118 -0
  149. package/test/custom-parser-async.test.js +59 -0
  150. package/test/custom-parser.0.test.js +701 -0
  151. package/test/custom-parser.1.test.js +266 -0
  152. package/test/custom-parser.2.test.js +91 -0
  153. package/test/custom-parser.3.test.js +208 -0
  154. package/test/custom-parser.4.test.js +218 -0
  155. package/test/custom-parser.5.test.js +130 -0
  156. package/test/custom-querystring-parser.test.js +129 -0
  157. package/test/decorator.test.js +1330 -0
  158. package/test/delete.test.js +344 -0
  159. package/test/diagnostics-channel/404.test.js +49 -0
  160. package/test/diagnostics-channel/async-delay-request.test.js +65 -0
  161. package/test/diagnostics-channel/async-request.test.js +64 -0
  162. package/test/diagnostics-channel/error-before-handler.test.js +35 -0
  163. package/test/diagnostics-channel/error-request.test.js +53 -0
  164. package/test/diagnostics-channel/error-status.test.js +123 -0
  165. package/test/diagnostics-channel/init.test.js +50 -0
  166. package/test/diagnostics-channel/sync-delay-request.test.js +49 -0
  167. package/test/diagnostics-channel/sync-request-reply.test.js +51 -0
  168. package/test/diagnostics-channel/sync-request.test.js +54 -0
  169. package/test/encapsulated-child-logger-factory.test.js +69 -0
  170. package/test/encapsulated-error-handler.test.js +237 -0
  171. package/test/esm/errorCodes.test.mjs +10 -0
  172. package/test/esm/esm.test.mjs +13 -0
  173. package/test/esm/index.test.js +8 -0
  174. package/test/esm/named-exports.mjs +14 -0
  175. package/test/esm/other.mjs +8 -0
  176. package/test/esm/plugin.mjs +8 -0
  177. package/test/fastify-instance.test.js +300 -0
  178. package/test/find-route.test.js +152 -0
  179. package/test/fluent-schema.test.js +209 -0
  180. package/test/genReqId.test.js +426 -0
  181. package/test/handler-context.test.js +45 -0
  182. package/test/handler-timeout.test.js +367 -0
  183. package/test/has-route.test.js +88 -0
  184. package/test/header-overflow.test.js +55 -0
  185. package/test/helper.js +496 -0
  186. package/test/hooks-async.test.js +1099 -0
  187. package/test/hooks.on-listen.test.js +1162 -0
  188. package/test/hooks.on-ready.test.js +421 -0
  189. package/test/hooks.test.js +3578 -0
  190. package/test/http-methods/copy.test.js +35 -0
  191. package/test/http-methods/custom-http-methods.test.js +114 -0
  192. package/test/http-methods/get.test.js +412 -0
  193. package/test/http-methods/head.test.js +263 -0
  194. package/test/http-methods/lock.test.js +108 -0
  195. package/test/http-methods/mkcalendar.test.js +143 -0
  196. package/test/http-methods/mkcol.test.js +35 -0
  197. package/test/http-methods/move.test.js +42 -0
  198. package/test/http-methods/propfind.test.js +136 -0
  199. package/test/http-methods/proppatch.test.js +105 -0
  200. package/test/http-methods/report.test.js +142 -0
  201. package/test/http-methods/search.test.js +233 -0
  202. package/test/http-methods/trace.test.js +21 -0
  203. package/test/http-methods/unlock.test.js +38 -0
  204. package/test/http2/closing.test.js +270 -0
  205. package/test/http2/constraint.test.js +109 -0
  206. package/test/http2/head.test.js +34 -0
  207. package/test/http2/plain.test.js +68 -0
  208. package/test/http2/secure-with-fallback.test.js +113 -0
  209. package/test/http2/secure.test.js +67 -0
  210. package/test/http2/unknown-http-method.test.js +34 -0
  211. package/test/https/custom-https-server.test.js +58 -0
  212. package/test/https/https.test.js +136 -0
  213. package/test/imports.test.js +17 -0
  214. package/test/inject.test.js +502 -0
  215. package/test/input-validation.js +335 -0
  216. package/test/internals/all.test.js +38 -0
  217. package/test/internals/content-type-parser.test.js +111 -0
  218. package/test/internals/context.test.js +31 -0
  219. package/test/internals/decorator.test.js +156 -0
  220. package/test/internals/errors.test.js +982 -0
  221. package/test/internals/handle-request.test.js +270 -0
  222. package/test/internals/hook-runner.test.js +449 -0
  223. package/test/internals/hooks.test.js +96 -0
  224. package/test/internals/initial-config.test.js +383 -0
  225. package/test/internals/logger.test.js +163 -0
  226. package/test/internals/plugin.test.js +170 -0
  227. package/test/internals/promise.test.js +63 -0
  228. package/test/internals/reply-serialize.test.js +714 -0
  229. package/test/internals/reply.test.js +1920 -0
  230. package/test/internals/req-id-gen-factory.test.js +133 -0
  231. package/test/internals/request-validate.test.js +1402 -0
  232. package/test/internals/request.test.js +506 -0
  233. package/test/internals/schema-controller-perf.test.js +40 -0
  234. package/test/internals/server.test.js +91 -0
  235. package/test/internals/validation.test.js +352 -0
  236. package/test/issue-4959.test.js +118 -0
  237. package/test/keep-alive-timeout.test.js +42 -0
  238. package/test/listen.1.test.js +154 -0
  239. package/test/listen.2.test.js +113 -0
  240. package/test/listen.3.test.js +83 -0
  241. package/test/listen.4.test.js +168 -0
  242. package/test/listen.5.test.js +122 -0
  243. package/test/logger/instantiation.test.js +341 -0
  244. package/test/logger/logger-test-utils.js +47 -0
  245. package/test/logger/logging.test.js +460 -0
  246. package/test/logger/options.test.js +579 -0
  247. package/test/logger/request.test.js +292 -0
  248. package/test/logger/response.test.js +183 -0
  249. package/test/logger/tap-parallel-not-ok +0 -0
  250. package/test/max-requests-per-socket.test.js +113 -0
  251. package/test/middleware.test.js +37 -0
  252. package/test/noop-set.test.js +19 -0
  253. package/test/nullable-validation.test.js +187 -0
  254. package/test/options.error-handler.test.js +5 -0
  255. package/test/options.test.js +5 -0
  256. package/test/output-validation.test.js +140 -0
  257. package/test/patch.error-handler.test.js +5 -0
  258. package/test/patch.test.js +5 -0
  259. package/test/plugin.1.test.js +230 -0
  260. package/test/plugin.2.test.js +314 -0
  261. package/test/plugin.3.test.js +287 -0
  262. package/test/plugin.4.test.js +504 -0
  263. package/test/plugin.helper.js +8 -0
  264. package/test/plugin.name.display.js +10 -0
  265. package/test/post-empty-body.test.js +38 -0
  266. package/test/pretty-print.test.js +366 -0
  267. package/test/promises.test.js +125 -0
  268. package/test/proto-poisoning.test.js +145 -0
  269. package/test/put.error-handler.test.js +5 -0
  270. package/test/put.test.js +5 -0
  271. package/test/register.test.js +184 -0
  272. package/test/reply-code.test.js +148 -0
  273. package/test/reply-early-hints.test.js +100 -0
  274. package/test/reply-error.test.js +815 -0
  275. package/test/reply-trailers.test.js +445 -0
  276. package/test/reply-web-stream-locked.test.js +37 -0
  277. package/test/request-error.test.js +624 -0
  278. package/test/request-header-host.test.js +339 -0
  279. package/test/request-id.test.js +118 -0
  280. package/test/request-timeout.test.js +53 -0
  281. package/test/route-hooks.test.js +635 -0
  282. package/test/route-prefix.test.js +904 -0
  283. package/test/route-shorthand.test.js +48 -0
  284. package/test/route.1.test.js +259 -0
  285. package/test/route.2.test.js +100 -0
  286. package/test/route.3.test.js +213 -0
  287. package/test/route.4.test.js +127 -0
  288. package/test/route.5.test.js +211 -0
  289. package/test/route.6.test.js +306 -0
  290. package/test/route.7.test.js +406 -0
  291. package/test/route.8.test.js +225 -0
  292. package/test/router-options.test.js +1108 -0
  293. package/test/same-shape.test.js +124 -0
  294. package/test/schema-examples.test.js +661 -0
  295. package/test/schema-feature.test.js +2198 -0
  296. package/test/schema-serialization.test.js +1171 -0
  297. package/test/schema-special-usage.test.js +1348 -0
  298. package/test/schema-validation.test.js +1572 -0
  299. package/test/scripts/validate-ecosystem-links.test.js +339 -0
  300. package/test/serialize-response.test.js +186 -0
  301. package/test/server.test.js +347 -0
  302. package/test/set-error-handler.test.js +69 -0
  303. package/test/skip-reply-send.test.js +317 -0
  304. package/test/stream-serializers.test.js +40 -0
  305. package/test/stream.1.test.js +94 -0
  306. package/test/stream.2.test.js +129 -0
  307. package/test/stream.3.test.js +198 -0
  308. package/test/stream.4.test.js +176 -0
  309. package/test/stream.5.test.js +188 -0
  310. package/test/sync-routes.test.js +32 -0
  311. package/test/throw.test.js +359 -0
  312. package/test/toolkit.js +63 -0
  313. package/test/trust-proxy.test.js +162 -0
  314. package/test/type-provider.test.js +22 -0
  315. package/test/types/content-type-parser.test-d.ts +72 -0
  316. package/test/types/decorate-request-reply.test-d.ts +18 -0
  317. package/test/types/dummy-plugin.ts +9 -0
  318. package/test/types/errors.test-d.ts +90 -0
  319. package/test/types/fastify.test-d.ts +352 -0
  320. package/test/types/hooks.test-d.ts +550 -0
  321. package/test/types/import.ts +2 -0
  322. package/test/types/instance.test-d.ts +588 -0
  323. package/test/types/logger.test-d.ts +277 -0
  324. package/test/types/plugin.test-d.ts +97 -0
  325. package/test/types/register.test-d.ts +237 -0
  326. package/test/types/reply.test-d.ts +254 -0
  327. package/test/types/request.test-d.ts +188 -0
  328. package/test/types/route.test-d.ts +553 -0
  329. package/test/types/schema.test-d.ts +135 -0
  330. package/test/types/serverFactory.test-d.ts +37 -0
  331. package/test/types/type-provider.test-d.ts +1213 -0
  332. package/test/types/using.test-d.ts +17 -0
  333. package/test/upgrade.test.js +52 -0
  334. package/test/url-rewriting.test.js +122 -0
  335. package/test/use-semicolon-delimiter.test.js +168 -0
  336. package/test/validation-error-handling.test.js +900 -0
  337. package/test/versioned-routes.test.js +603 -0
  338. package/test/web-api.test.js +616 -0
  339. package/test/wrap-thenable.test.js +30 -0
  340. package/types/content-type-parser.d.ts +75 -0
  341. package/types/context.d.ts +22 -0
  342. package/types/errors.d.ts +92 -0
  343. package/types/hooks.d.ts +875 -0
  344. package/types/instance.d.ts +609 -0
  345. package/types/logger.d.ts +107 -0
  346. package/types/plugin.d.ts +44 -0
  347. package/types/register.d.ts +42 -0
  348. package/types/reply.d.ts +81 -0
  349. package/types/request.d.ts +95 -0
  350. package/types/route.d.ts +199 -0
  351. package/types/schema.d.ts +61 -0
  352. package/types/server-factory.d.ts +19 -0
  353. package/types/type-provider.d.ts +130 -0
  354. package/types/utils.d.ts +98 -0
@@ -0,0 +1,295 @@
1
+ <h1 align="center">Fastify</h1>
2
+
3
+ ## Request
4
+ The first parameter of the handler function is `Request`.
5
+
6
+ Request is a core Fastify object containing the following fields:
7
+ - `query` - The parsed querystring, its format is specified by
8
+ [`querystringParser`](./Server.md#querystringparser).
9
+ - `body` - The request payload, see [Content-Type Parser](./ContentTypeParser.md)
10
+ for details on what request payloads Fastify natively parses and how to support
11
+ other content types.
12
+ - `params` - The params matching the URL.
13
+ - [`headers`](#headers) - The headers getter and setter.
14
+ - `raw` - The incoming HTTP request from Node core.
15
+ - `server` - The Fastify server instance, scoped to the current
16
+ [encapsulation context](./Encapsulation.md).
17
+ - `id` - The request ID.
18
+ - `log` - The logger instance of the incoming request.
19
+ - `ip` - The IP address of the incoming request.
20
+ - `ips` - An array of the IP addresses, ordered from closest to furthest, in the
21
+ `X-Forwarded-For` header of the incoming request (only when the
22
+ [`trustProxy`](./Server.md#factory-trust-proxy) option is enabled).
23
+ - `host` - The host of the incoming request (derived from `X-Forwarded-Host`
24
+ header when the [`trustProxy`](./Server.md#factory-trust-proxy) option is
25
+ enabled). For HTTP/2 compatibility, it returns `:authority` if no host header
26
+ exists. The host header may return an empty string if `requireHostHeader` is
27
+ `false`, not provided with HTTP/1.0, or removed by schema validation.
28
+ ⚠ Security: this value comes from client-controlled headers; only trust it
29
+ when you control proxy behavior and have validated or allow-listed hosts.
30
+ No additional validation is performed beyond RFC parsing (see
31
+ [RFC 9110, section 7.2](https://www.rfc-editor.org/rfc/rfc9110#section-7.2) and
32
+ [RFC 3986, section 3.2.2](https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2)).
33
+ - `hostname` - The hostname derived from the `host` property of the incoming request.
34
+ - `port` - The port from the `host` property, which may refer to the port the
35
+ server is listening on.
36
+ - `protocol` - The protocol of the incoming request (`https` or `http`).
37
+ - `method` - The method of the incoming request.
38
+ - `url` - The URL of the incoming request.
39
+ - `originalUrl` - Similar to `url`, allows access to the original `url` in
40
+ case of internal re-routing.
41
+ - `is404` - `true` if request is being handled by 404 handler, `false` otherwise.
42
+ - `socket` - The underlying connection of the incoming request.
43
+ - `signal` - An `AbortSignal` that aborts when the handler timeout
44
+ fires or the client disconnects. Created lazily on first access, so
45
+ there is zero overhead when not used. When
46
+ [`handlerTimeout`](./Server.md#factory-handler-timeout) is configured,
47
+ the signal is pre-created and also aborts on timeout. Pass it to
48
+ `fetch()`, database queries, or any API accepting a `signal` option
49
+ for cooperative cancellation. On timeout, `signal.reason` is the
50
+ `FST_ERR_HANDLER_TIMEOUT` error; on client disconnect it is a generic
51
+ `AbortError`. Check `signal.reason.code` to distinguish the two cases.
52
+ - `context` - Deprecated, use `request.routeOptions.config` instead. A Fastify
53
+ internal object. Do not use or modify it directly. It is useful to access one
54
+ special key:
55
+ - `context.config` - The route [`config`](./Routes.md#routes-config) object.
56
+ - `routeOptions` - The route [`option`](./Routes.md#routes-options) object.
57
+ - `bodyLimit` - Either server limit or route limit.
58
+ - `handlerTimeout` - The handler timeout configured for this route.
59
+ - `config` - The [`config`](./Routes.md#routes-config) object for this route.
60
+ - `method` - The HTTP method for the route.
61
+ - `url` - The path of the URL to match this route.
62
+ - `handler` - The handler for this route.
63
+ - `attachValidation` - Attach `validationError` to request (if there is
64
+ a schema defined).
65
+ - `logLevel` - Log level defined for this route.
66
+ - `schema` - The JSON schemas definition for this route.
67
+ - `version` - A semver compatible string that defines the version of the endpoint.
68
+ - `exposeHeadRoute` - Creates a sibling HEAD route for any GET routes.
69
+ - `prefixTrailingSlash` - String used to determine how to handle passing `/`
70
+ as a route with a prefix.
71
+ - [.getValidationFunction(schema | httpPart)](#getvalidationfunction) -
72
+ Returns a validation function for the specified schema or HTTP part, if
73
+ set or cached.
74
+ - [.compileValidationSchema(schema, [httpPart])](#compilevalidationschema) -
75
+ Compiles the specified schema and returns a validation function using the
76
+ default (or customized) `ValidationCompiler`. The optional `httpPart` is
77
+ forwarded to the `ValidationCompiler` if provided, defaults to `null`.
78
+ - [.validateInput(data, schema | httpPart, [httpPart])](#validate) -
79
+ Validates the input using the specified schema and returns the serialized
80
+ payload. If `httpPart` is provided, the function uses the serializer for
81
+ that HTTP Status Code. Defaults to `null`.
82
+
83
+ ### Headers
84
+
85
+ The `request.headers` is a getter that returns an object with the headers of the
86
+ incoming request. Set custom headers as follows:
87
+
88
+ ```js
89
+ request.headers = {
90
+ 'foo': 'bar',
91
+ 'baz': 'qux'
92
+ }
93
+ ```
94
+
95
+ This operation adds new values to the request headers, accessible via
96
+ `request.headers.bar`. Standard request headers remain accessible via
97
+ `request.raw.headers`.
98
+
99
+ For performance reasons, `Symbol('fastify.RequestAcceptVersion')` may be added
100
+ to headers on `not found` routes.
101
+
102
+ > ℹ️ Note:
103
+ > Schema validation may mutate the `request.headers` and
104
+ > `request.raw.headers` objects, causing the headers to become empty.
105
+
106
+ ```js
107
+ fastify.post('/:params', options, function (request, reply) {
108
+ console.log(request.body)
109
+ console.log(request.query)
110
+ console.log(request.params)
111
+ console.log(request.headers)
112
+ console.log(request.raw)
113
+ console.log(request.server)
114
+ console.log(request.id)
115
+ console.log(request.ip)
116
+ console.log(request.ips)
117
+ console.log(request.host)
118
+ console.log(request.hostname)
119
+ console.log(request.port)
120
+ console.log(request.protocol)
121
+ console.log(request.url)
122
+ console.log(request.routeOptions.method)
123
+ console.log(request.routeOptions.bodyLimit)
124
+ console.log(request.routeOptions.method)
125
+ console.log(request.routeOptions.url)
126
+ console.log(request.routeOptions.attachValidation)
127
+ console.log(request.routeOptions.logLevel)
128
+ console.log(request.routeOptions.version)
129
+ console.log(request.routeOptions.exposeHeadRoute)
130
+ console.log(request.routeOptions.prefixTrailingSlash)
131
+ console.log(request.routeOptions.logLevel)
132
+ request.log.info('some info')
133
+ })
134
+ ```
135
+ ### .getValidationFunction(schema | httpPart)
136
+ <a id="getvalidationfunction"></a>
137
+
138
+ By calling this function with a provided `schema` or `httpPart`, it returns a
139
+ `validation` function to validate diverse inputs. It returns `undefined` if no
140
+ serialization function is found using the provided inputs.
141
+
142
+ This function has an `errors` property. Errors encountered during the last
143
+ validation are assigned to `errors`.
144
+
145
+ ```js
146
+ const validate = request
147
+ .getValidationFunction({
148
+ type: 'object',
149
+ properties: {
150
+ foo: {
151
+ type: 'string'
152
+ }
153
+ }
154
+ })
155
+ console.log(validate({ foo: 'bar' })) // true
156
+ console.log(validate.errors) // null
157
+
158
+ // or
159
+
160
+ const validate = request
161
+ .getValidationFunction('body')
162
+ console.log(validate({ foo: 0.5 })) // false
163
+ console.log(validate.errors) // validation errors
164
+ ```
165
+
166
+ See [.compileValidationSchema(schema, [httpStatus])](#compileValidationSchema)
167
+ for more information on compiling validation schemas.
168
+
169
+ ### .compileValidationSchema(schema, [httpPart])
170
+ <a id="compilevalidationschema"></a>
171
+
172
+ This function compiles a validation schema and returns a function to validate data.
173
+ The returned function (a.k.a. _validation function_) is compiled using the provided
174
+ [`SchemaController#ValidationCompiler`](./Server.md#schema-controller). A `WeakMap`
175
+ is used to cache this, reducing compilation calls.
176
+
177
+ The optional parameter `httpPart`, if provided, is forwarded to the
178
+ `ValidationCompiler`, allowing it to compile the validation function if a custom
179
+ `ValidationCompiler` is provided for the route.
180
+
181
+ This function has an `errors` property. Errors encountered during the last
182
+ validation are assigned to `errors`.
183
+
184
+ ```js
185
+ const validate = request
186
+ .compileValidationSchema({
187
+ type: 'object',
188
+ properties: {
189
+ foo: {
190
+ type: 'string'
191
+ }
192
+ }
193
+ })
194
+ console.log(validate({ foo: 'bar' })) // true
195
+ console.log(validate.errors) // null
196
+
197
+ // or
198
+
199
+ const validate = request
200
+ .compileValidationSchema({
201
+ type: 'object',
202
+ properties: {
203
+ foo: {
204
+ type: 'string'
205
+ }
206
+ }
207
+ }, 200)
208
+ console.log(validate({ hello: 'world' })) // false
209
+ console.log(validate.errors) // validation errors
210
+ ```
211
+
212
+ Be careful when using this function, as it caches compiled validation functions
213
+ based on the provided schema. If schemas are mutated or changed, the validation
214
+ functions will not detect the alterations and will reuse the previously compiled
215
+ validation function, as the cache is based on the schema's reference.
216
+
217
+ If schema properties need to be changed, create a new schema object to benefit
218
+ from the cache mechanism.
219
+
220
+ Using the following schema as an example:
221
+ ```js
222
+ const schema1 = {
223
+ type: 'object',
224
+ properties: {
225
+ foo: {
226
+ type: 'string'
227
+ }
228
+ }
229
+ }
230
+ ```
231
+
232
+ *Not*
233
+ ```js
234
+ const validate = request.compileValidationSchema(schema1)
235
+
236
+ // Later on...
237
+ schema1.properties.foo.type. = 'integer'
238
+ const newValidate = request.compileValidationSchema(schema1)
239
+
240
+ console.log(newValidate === validate) // true
241
+ ```
242
+
243
+ *Instead*
244
+ ```js
245
+ const validate = request.compileValidationSchema(schema1)
246
+
247
+ // Later on...
248
+ const newSchema = Object.assign({}, schema1)
249
+ newSchema.properties.foo.type = 'integer'
250
+
251
+ const newValidate = request.compileValidationSchema(newSchema)
252
+
253
+ console.log(newValidate === validate) // false
254
+ ```
255
+
256
+ ### .validateInput(data, [schema | httpPart], [httpPart])
257
+ <a id="validate"></a>
258
+
259
+ This function validates the input based on the provided schema or HTTP part. If
260
+ both are provided, the `httpPart` parameter takes precedence.
261
+
262
+ If no validation function exists for a given `schema`, a new validation function
263
+ will be compiled, forwarding the `httpPart` if provided.
264
+
265
+ ```js
266
+ request
267
+ .validateInput({ foo: 'bar'}, {
268
+ type: 'object',
269
+ properties: {
270
+ foo: {
271
+ type: 'string'
272
+ }
273
+ }
274
+ }) // true
275
+
276
+ // or
277
+
278
+ request
279
+ .validateInput({ foo: 'bar'}, {
280
+ type: 'object',
281
+ properties: {
282
+ foo: {
283
+ type: 'string'
284
+ }
285
+ }
286
+ }, 'body') // true
287
+
288
+ // or
289
+
290
+ request
291
+ .validateInput({ hello: 'world'}, 'query') // false
292
+ ```
293
+
294
+ See [.compileValidationSchema(schema, [httpStatus])](#compileValidationSchema)
295
+ for more information on compiling validation schemas.