fastify 4.27.0 → 5.0.0-alpha.2

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 (328) hide show
  1. package/.markdownlint-cli2.yaml +1 -1
  2. package/.tap/processinfo/09002e93-10ad-430c-bc86-c0576928b0ed.json +241 -0
  3. package/.tap/processinfo/ee66c5ab-635d-48b5-8be6-3dc3ceea5bfc.json +268 -0
  4. package/.tap/test-results/test/404s.test.js.tap +623 -0
  5. package/.tap/test-results/test/500s.test.js.tap +64 -0
  6. package/.tap/test-results/test/allowUnsafeRegex.test.js.tap +36 -0
  7. package/.tap/test-results/test/als.test.js.tap +15 -0
  8. package/.tap/test-results/test/async-await.test.js.tap +184 -0
  9. package/.tap/test-results/test/async-dispose.test.js.tap +8 -0
  10. package/.tap/test-results/test/async_hooks.test.js.tap +10 -0
  11. package/.tap/test-results/test/bodyLimit.test.js.tap +48 -0
  12. package/.tap/test-results/test/buffer.test.js.tap +20 -0
  13. package/.tap/test-results/test/build/error-serializer.test.js.tap +12 -0
  14. package/.tap/test-results/test/build/version.test.js.tap +7 -0
  15. package/.tap/test-results/test/case-insensitive.test.js.tap +36 -0
  16. package/.tap/test-results/test/chainable.test.js.tap +17 -0
  17. package/.tap/test-results/test/check.test.js.tap +10 -0
  18. package/.tap/test-results/test/childLoggerFactory.test.js.tap +23 -0
  19. package/.tap/test-results/test/client-timeout.test.js.tap +7 -0
  20. package/.tap/test-results/test/close-pipelining.test.js.tap +15 -0
  21. package/.tap/test-results/test/close.test.js.tap +172 -0
  22. package/.tap/test-results/test/connectionTimeout.test.js.tap +12 -0
  23. package/.tap/test-results/test/constrained-routes.test.js.tap +173 -0
  24. package/.tap/test-results/test/content-length.test.js.tap +46 -0
  25. package/.tap/test-results/test/content-parser.test.js.tap +266 -0
  26. package/.tap/test-results/test/content-type.test.js.tap +14 -0
  27. package/.tap/test-results/test/context-config.test.js.tap +41 -0
  28. package/.tap/test-results/test/copy.test.js.tap +14 -0
  29. package/.tap/test-results/test/custom-http-server.test.js.tap +30 -0
  30. package/.tap/test-results/test/custom-parser-async.test.js.tap +21 -0
  31. package/.tap/test-results/test/custom-parser.0.test.js.tap +199 -0
  32. package/.tap/test-results/test/custom-parser.1.test.js.tap +90 -0
  33. package/.tap/test-results/test/custom-parser.2.test.js.tap +22 -0
  34. package/.tap/test-results/test/custom-parser.3.test.js.tap +53 -0
  35. package/.tap/test-results/test/custom-parser.4.test.js.tap +45 -0
  36. package/.tap/test-results/test/custom-parser.5.test.js.tap +41 -0
  37. package/.tap/test-results/test/custom-querystring-parser.test.js.tap +46 -0
  38. package/.tap/test-results/test/decorator.test.js.tap +465 -0
  39. package/.tap/test-results/test/delete.test.js.tap +110 -0
  40. package/.tap/test-results/test/diagnostics-channel/404.test.js.tap +15 -0
  41. package/.tap/test-results/test/diagnostics-channel/async-delay-request.test.js.tap +25 -0
  42. package/.tap/test-results/test/diagnostics-channel/async-request.test.js.tap +24 -0
  43. package/.tap/test-results/test/diagnostics-channel/error-before-handler.test.js.tap +9 -0
  44. package/.tap/test-results/test/diagnostics-channel/error-request.test.js.tap +20 -0
  45. package/.tap/test-results/test/diagnostics-channel/error-status.test.js.tap +10 -0
  46. package/.tap/test-results/test/diagnostics-channel/init.test.js.tap +14 -0
  47. package/.tap/test-results/test/diagnostics-channel/sync-delay-request.test.js.tap +16 -0
  48. package/.tap/test-results/test/diagnostics-channel/sync-request-reply.test.js.tap +16 -0
  49. package/.tap/test-results/test/diagnostics-channel/sync-request.test.js.tap +19 -0
  50. package/.tap/test-results/test/encapsulated-child-logger-factory.test.js.tap +18 -0
  51. package/.tap/test-results/test/encapsulated-error-handler.test.js.tap +243 -0
  52. package/.tap/test-results/test/esm/errorCodes.test.mjs.tap +9 -0
  53. package/.tap/test-results/test/esm/esm.test.mjs.tap +8 -0
  54. package/.tap/test-results/test/esm/index.test.js.tap +8 -0
  55. package/.tap/test-results/test/fastify-instance.test.js.tap +114 -0
  56. package/.tap/test-results/test/findRoute.test.js.tap +37 -0
  57. package/.tap/test-results/test/fluent-schema.test.js.tap +36 -0
  58. package/.tap/test-results/test/genReqId.test.js.tap +106 -0
  59. package/.tap/test-results/test/get.test.js.tap +151 -0
  60. package/.tap/test-results/test/handler-context.test.js.tap +19 -0
  61. package/.tap/test-results/test/has-route.test.js.tap +30 -0
  62. package/.tap/test-results/test/head.test.js.tap +130 -0
  63. package/.tap/test-results/test/header-overflow.test.js.tap +16 -0
  64. package/.tap/test-results/test/hooks-async.test.js.tap +286 -0
  65. package/.tap/test-results/test/hooks.on-listen.test.js.tap +311 -0
  66. package/.tap/test-results/test/hooks.on-ready.test.js.tap +151 -0
  67. package/.tap/test-results/test/hooks.test.js.tap +966 -0
  68. package/.tap/test-results/test/http2/closing.test.js.tap +35 -0
  69. package/.tap/test-results/test/http2/constraint.test.js.tap +32 -0
  70. package/.tap/test-results/test/http2/head.test.js.tap +9 -0
  71. package/.tap/test-results/test/http2/missing-http2-module.test.js.tap +8 -0
  72. package/.tap/test-results/test/http2/plain.test.js.tap +22 -0
  73. package/.tap/test-results/test/http2/secure-with-fallback.test.js.tap +40 -0
  74. package/.tap/test-results/test/http2/secure.test.js.tap +27 -0
  75. package/.tap/test-results/test/http2/unknown-http-method.test.js.tap +9 -0
  76. package/.tap/test-results/test/https/custom-https-server.test.js.tap +10 -0
  77. package/.tap/test-results/test/https/https.test.js.tap +45 -0
  78. package/.tap/test-results/test/imports.test.js.tap +14 -0
  79. package/.tap/test-results/test/inject.test.js.tap +165 -0
  80. package/.tap/test-results/test/internals/all.test.js.tap +42 -0
  81. package/.tap/test-results/test/internals/contentTypeParser.test.js.tap +14 -0
  82. package/.tap/test-results/test/internals/context.test.js.tap +14 -0
  83. package/.tap/test-results/test/internals/decorator.test.js.tap +51 -0
  84. package/.tap/test-results/test/internals/errors.test.js.tap +1212 -0
  85. package/.tap/test-results/test/internals/handleRequest.test.js.tap +69 -0
  86. package/.tap/test-results/test/internals/hookRunner.test.js.tap +143 -0
  87. package/.tap/test-results/test/internals/hooks.test.js.tap +45 -0
  88. package/.tap/test-results/test/internals/initialConfig.test.js.tap +125 -0
  89. package/.tap/test-results/test/internals/logger.test.js.tap +71 -0
  90. package/.tap/test-results/test/internals/plugin.test.js.tap +48 -0
  91. package/.tap/test-results/test/internals/reply-serialize.test.js.tap +166 -0
  92. package/.tap/test-results/test/internals/reply.test.js.tap +688 -0
  93. package/.tap/test-results/test/internals/reqIdGenFactory.test.js.tap +74 -0
  94. package/.tap/test-results/test/internals/request-validate.test.js.tap +384 -0
  95. package/.tap/test-results/test/internals/request.test.js.tap +163 -0
  96. package/.tap/test-results/test/internals/server.test.js.tap +30 -0
  97. package/.tap/test-results/test/internals/validation.test.js.tap +121 -0
  98. package/.tap/test-results/test/keepAliveTimeout.test.js.tap +12 -0
  99. package/.tap/test-results/test/listen.1.test.js.tap +31 -0
  100. package/.tap/test-results/test/listen.2.test.js.tap +46 -0
  101. package/.tap/test-results/test/listen.3.test.js.tap +25 -0
  102. package/.tap/test-results/test/listen.4.test.js.tap +51 -0
  103. package/.tap/test-results/test/lock.test.js.tap +29 -0
  104. package/.tap/test-results/test/logger/instantiation.test.js.tap +92 -0
  105. package/.tap/test-results/test/logger/logging.test.js.tap +117 -0
  106. package/.tap/test-results/test/logger/options.test.js.tap +165 -0
  107. package/.tap/test-results/test/logger/request.test.js.tap +82 -0
  108. package/.tap/test-results/test/logger/response.test.js.tap +38 -0
  109. package/.tap/test-results/test/maxRequestsPerSocket.test.js.tap +44 -0
  110. package/.tap/test-results/test/method-missing.test.js.tap +8 -0
  111. package/.tap/test-results/test/middleware.test.js.tap +17 -0
  112. package/.tap/test-results/test/mkcalendar.test.js.tap +43 -0
  113. package/.tap/test-results/test/mkcol.test.js.tap +14 -0
  114. package/.tap/test-results/test/move.test.js.tap +15 -0
  115. package/.tap/test-results/test/noop-set.test.js.tap +8 -0
  116. package/.tap/test-results/test/nullable-validation.test.js.tap +36 -0
  117. package/.tap/test-results/test/options.error-handler.test.js.tap +186 -0
  118. package/.tap/test-results/test/options.test.js.tap +174 -0
  119. package/.tap/test-results/test/output-validation.test.js.tap +66 -0
  120. package/.tap/test-results/test/patch.error-handler.test.js.tap +206 -0
  121. package/.tap/test-results/test/patch.test.js.tap +182 -0
  122. package/.tap/test-results/test/plugin.1.test.js.tap +78 -0
  123. package/.tap/test-results/test/plugin.2.test.js.tap +102 -0
  124. package/.tap/test-results/test/plugin.3.test.js.tap +58 -0
  125. package/.tap/test-results/test/plugin.4.test.js.tap +164 -0
  126. package/.tap/test-results/test/post-empty-body.test.js.tap +8 -0
  127. package/.tap/test-results/test/pretty-print.test.js.tap +82 -0
  128. package/.tap/test-results/test/promises.test.js.tap +46 -0
  129. package/.tap/test-results/test/propfind.test.js.tap +43 -0
  130. package/.tap/test-results/test/proppatch.test.js.tap +29 -0
  131. package/.tap/test-results/test/proto-poisoning.test.js.tap +47 -0
  132. package/.tap/test-results/test/put.error-handler.test.js.tap +206 -0
  133. package/.tap/test-results/test/put.test.js.tap +182 -0
  134. package/.tap/test-results/test/register.test.js.tap +61 -0
  135. package/.tap/test-results/test/reply-code.test.js.tap +40 -0
  136. package/.tap/test-results/test/reply-earlyHints.test.js.tap +22 -0
  137. package/.tap/test-results/test/reply-error.test.js.tap +643 -0
  138. package/.tap/test-results/test/reply-trailers.test.js.tap +176 -0
  139. package/.tap/test-results/test/report.test.js.tap +43 -0
  140. package/.tap/test-results/test/request-error.test.js.tap +98 -0
  141. package/.tap/test-results/test/request-id.test.js.tap +38 -0
  142. package/.tap/test-results/test/request.deprecated.test.js.tap +13 -0
  143. package/.tap/test-results/test/requestTimeout.test.js.tap +21 -0
  144. package/.tap/test-results/test/route-hooks.test.js.tap +498 -0
  145. package/.tap/test-results/test/route-prefix.test.js.tap +195 -0
  146. package/.tap/test-results/test/route-shorthand.test.js.tap +190 -0
  147. package/.tap/test-results/test/route.1.test.js.tap +93 -0
  148. package/.tap/test-results/test/route.2.test.js.tap +28 -0
  149. package/.tap/test-results/test/route.3.test.js.tap +39 -0
  150. package/.tap/test-results/test/route.4.test.js.tap +32 -0
  151. package/.tap/test-results/test/route.5.test.js.tap +54 -0
  152. package/.tap/test-results/test/route.6.test.js.tap +81 -0
  153. package/.tap/test-results/test/route.7.test.js.tap +93 -0
  154. package/.tap/test-results/test/route.8.test.js.tap +38 -0
  155. package/.tap/test-results/test/router-options.test.js.tap +104 -0
  156. package/.tap/test-results/test/same-shape.test.js.tap +22 -0
  157. package/.tap/test-results/test/schema-examples.test.js.tap +85 -0
  158. package/.tap/test-results/test/schema-feature.test.js.tap +445 -0
  159. package/.tap/test-results/test/schema-serialization.test.js.tap +194 -0
  160. package/.tap/test-results/test/schema-special-usage.test.js.tap +186 -0
  161. package/.tap/test-results/test/schema-validation.test.js.tap +199 -0
  162. package/.tap/test-results/test/search.test.js.tap +77 -0
  163. package/.tap/test-results/test/serialize-response.test.js.tap +26 -0
  164. package/.tap/test-results/test/server.test.js.tap +65 -0
  165. package/.tap/test-results/test/set-error-handler.test.js.tap +7 -0
  166. package/.tap/test-results/test/skip-reply-send.test.js.tap +272 -0
  167. package/.tap/test-results/test/stream.1.test.js.tap +36 -0
  168. package/.tap/test-results/test/stream.2.test.js.tap +20 -0
  169. package/.tap/test-results/test/stream.3.test.js.tap +34 -0
  170. package/.tap/test-results/test/stream.4.test.js.tap +40 -0
  171. package/.tap/test-results/test/stream.5.test.js.tap +37 -0
  172. package/.tap/test-results/test/sync-routes.test.js.tap +19 -0
  173. package/.tap/test-results/test/throw.test.js.tap +116 -0
  174. package/.tap/test-results/test/trace.test.js.tap +7 -0
  175. package/.tap/test-results/test/trust-proxy.test.js.tap +109 -0
  176. package/.tap/test-results/test/type-provider.test.js.tap +12 -0
  177. package/.tap/test-results/test/unlock.test.js.tap +14 -0
  178. package/.tap/test-results/test/upgrade.test.js.tap +8 -0
  179. package/.tap/test-results/test/url-rewriting.test.js.tap +39 -0
  180. package/.tap/test-results/test/useSemicolonDelimiter.test.js.tap +33 -0
  181. package/.tap/test-results/test/validation-error-handling.test.js.tap +180 -0
  182. package/.tap/test-results/test/versioned-routes.test.js.tap +151 -0
  183. package/.tap/test-results/test/web-api.test.js.tap +51 -0
  184. package/.tap/test-results/test/wrapThenable.test.js.tap +11 -0
  185. package/.taprc +4 -8
  186. package/README.md +3 -6
  187. package/build/build-error-serializer.js +4 -1
  188. package/build/build-validation.js +5 -4
  189. package/docs/Guides/Database.md +1 -1
  190. package/docs/Guides/Delay-Accepting-Requests.md +3 -3
  191. package/docs/Guides/Ecosystem.md +2 -0
  192. package/docs/Guides/Migration-Guide-V5.md +20 -0
  193. package/docs/Guides/Write-Type-Provider.md +4 -2
  194. package/docs/Reference/ContentTypeParser.md +30 -1
  195. package/docs/Reference/Decorators.md +42 -16
  196. package/docs/Reference/Errors.md +10 -2
  197. package/docs/Reference/Hooks.md +48 -14
  198. package/docs/Reference/Logging.md +5 -5
  199. package/docs/Reference/Reply.md +29 -24
  200. package/docs/Reference/Request.md +5 -1
  201. package/docs/Reference/Routes.md +24 -28
  202. package/docs/Reference/Server.md +14 -53
  203. package/docs/Reference/Type-Providers.md +21 -26
  204. package/docs/Reference/TypeScript.md +46 -29
  205. package/docs/Reference/Warnings.md +2 -8
  206. package/eslint.config.js +27 -0
  207. package/examples/typescript-server.ts +14 -14
  208. package/fastify.d.ts +15 -14
  209. package/fastify.js +41 -15
  210. package/lib/configValidator.js +94 -76
  211. package/lib/contentTypeParser.js +54 -88
  212. package/lib/decorate.js +3 -7
  213. package/lib/error-serializer.js +77 -19
  214. package/lib/errors.js +31 -6
  215. package/lib/handleRequest.js +70 -39
  216. package/lib/httpMethods.js +34 -18
  217. package/lib/logger.js +24 -6
  218. package/lib/pluginUtils.js +5 -5
  219. package/lib/reply.js +16 -13
  220. package/lib/request.js +37 -19
  221. package/lib/route.js +7 -31
  222. package/lib/server.js +62 -123
  223. package/lib/warnings.js +28 -27
  224. package/lib/wrapThenable.js +46 -22
  225. package/package.json +38 -58
  226. package/test/404s.test.js +8 -12
  227. package/test/async-await.test.js +46 -2
  228. package/test/build/error-serializer.test.js +4 -2
  229. package/test/check.test.js +225 -0
  230. package/test/close-pipelining.test.js +2 -34
  231. package/test/close.test.js +1 -41
  232. package/test/content-parser.test.js +69 -117
  233. package/test/custom-parser.1.test.js +40 -1
  234. package/test/decorator-namespace.test._js_ +31 -0
  235. package/test/decorator.test.js +92 -43
  236. package/test/delete.test.js +21 -1
  237. package/test/diagnostics-channel/404.test.js +57 -0
  238. package/test/diagnostics-channel/async-delay-request.test.js +74 -0
  239. package/test/diagnostics-channel/async-request.test.js +72 -0
  240. package/test/diagnostics-channel/error-before-handler.test.js +36 -0
  241. package/test/diagnostics-channel/error-request.test.js +61 -0
  242. package/test/diagnostics-channel/error-status.test.js +39 -0
  243. package/test/{diagnostics-channel.test.js → diagnostics-channel/init.test.js} +6 -16
  244. package/test/diagnostics-channel/sync-delay-request.test.js +58 -0
  245. package/test/diagnostics-channel/sync-request-reply.test.js +58 -0
  246. package/test/diagnostics-channel/sync-request.test.js +61 -0
  247. package/test/encapsulated-error-handler.test.js +201 -14
  248. package/test/esm/index.test.js +2 -12
  249. package/test/findRoute.test.js +16 -0
  250. package/test/genReqId.test.js +9 -0
  251. package/test/get.test.js +28 -0
  252. package/test/has-route.test.js +18 -2
  253. package/test/helper.js +1 -5
  254. package/test/hooks.test.js +0 -4
  255. package/test/http2/constraint.test.js +22 -1
  256. package/test/http2/plain.test.js +21 -6
  257. package/test/http2/secure.test.js +12 -1
  258. package/test/https/https.test.js +57 -0
  259. package/test/inject.test.js +1 -2
  260. package/test/internals/decorator.test.js +0 -2
  261. package/test/internals/errors.test.js +57 -17
  262. package/test/internals/handleRequest.test.js +5 -1
  263. package/test/internals/initialConfig.test.js +5 -5
  264. package/test/internals/logger.test.js +31 -2
  265. package/test/internals/reply.test.js +38 -80
  266. package/test/internals/request.test.js +13 -11
  267. package/test/listen.1.test.js +5 -15
  268. package/test/listen.5.test.js +88 -0
  269. package/test/logger/instantiation.test.js +8 -8
  270. package/test/logger/logging.test.js +4 -4
  271. package/test/logger/options.test.js +102 -21
  272. package/test/logger/response.test.js +6 -6
  273. package/test/maxRequestsPerSocket.test.js +2 -5
  274. package/test/method-missing.test.js +24 -0
  275. package/test/plugin.1.test.js +2 -4
  276. package/test/plugin.2.test.js +0 -2
  277. package/test/plugin.3.test.js +0 -2
  278. package/test/plugin.4.test.js +92 -56
  279. package/test/register.test.js +2 -4
  280. package/test/reply-earlyHints.test.js +98 -0
  281. package/test/reply-error.test.js +0 -2
  282. package/test/route-hooks.test.js +0 -1
  283. package/test/route-shorthand.test.js +60 -0
  284. package/test/schema-special-usage.test.js +1 -1
  285. package/test/server.test.js +17 -2
  286. package/test/stream.2.test.js +1 -1
  287. package/test/stream.4.test.js +0 -42
  288. package/test/stream.5.test.js +2 -2
  289. package/test/trust-proxy.test.js +33 -27
  290. package/test/types/errors.test-d.ts +0 -2
  291. package/test/types/fastify.test-d.ts +14 -12
  292. package/test/types/hooks.test-d.ts +1 -0
  293. package/test/types/import.ts +1 -0
  294. package/test/types/instance.test-d.ts +10 -51
  295. package/test/types/logger.test-d.ts +43 -6
  296. package/test/types/plugin.test-d.ts +5 -2
  297. package/test/types/register.test-d.ts +2 -2
  298. package/test/types/reply.test-d.ts +13 -12
  299. package/test/types/request.test-d.ts +19 -8
  300. package/test/types/route.test-d.ts +30 -2
  301. package/test/types/schema.test-d.ts +2 -2
  302. package/test/types/serverFactory.test-d.ts +1 -1
  303. package/test/types/type-provider.test-d.ts +60 -13
  304. package/test/types/using.test-d.ts +4 -1
  305. package/test/url-rewriting.test.js +3 -2
  306. package/test/useSemicolonDelimiter.test.js +3 -6
  307. package/test/versioned-routes.test.js +1 -1
  308. package/test/web-api.test.js +0 -6
  309. package/types/content-type-parser.d.ts +3 -3
  310. package/types/context.d.ts +0 -1
  311. package/types/errors.d.ts +1 -0
  312. package/types/hooks.d.ts +6 -6
  313. package/types/instance.d.ts +28 -41
  314. package/types/logger.d.ts +3 -3
  315. package/types/plugin.d.ts +3 -3
  316. package/types/reply.d.ts +13 -14
  317. package/types/request.d.ts +5 -3
  318. package/types/route.d.ts +29 -29
  319. package/types/schema.d.ts +3 -3
  320. package/types/serverFactory.d.ts +2 -2
  321. package/types/type-provider.d.ts +22 -12
  322. package/types/utils.d.ts +18 -18
  323. package/.c8rc.json +0 -8
  324. package/.eslintrc +0 -4
  325. package/test/default-route.test.js +0 -88
  326. package/test/listen.deprecated.test.js +0 -229
  327. package/test/unsupported-httpversion.test.js +0 -31
  328. package/types/.eslintrc.json +0 -48
@@ -1,12 +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('../fastify')
8
6
  const fp = require('fastify-plugin')
9
7
  const fakeTimer = require('@sinonjs/fake-timers')
8
+ const { FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER } = require('../lib/errors')
10
9
 
11
10
  test('pluginTimeout', t => {
12
11
  t.plan(5)
@@ -133,6 +132,9 @@ test('plugin metadata - version not matching requirement', t => {
133
132
  test('plugin metadata - version not matching requirement 2', t => {
134
133
  t.plan(2)
135
134
  const fastify = Fastify()
135
+ Object.defineProperty(fastify, 'version', {
136
+ value: '99.0.0'
137
+ })
136
138
 
137
139
  plugin[Symbol.for('skip-override')] = true
138
140
  plugin[Symbol.for('plugin-meta')] = {
@@ -198,36 +200,75 @@ test('plugin metadata - release candidate', t => {
198
200
  }
199
201
  })
200
202
 
201
- test('fastify-rc loads prior version plugins', t => {
202
- t.plan(2)
203
- const fastify = Fastify()
204
- Object.defineProperty(fastify, 'version', {
205
- value: '99.0.0-rc.1'
203
+ test('fastify-rc loads prior version plugins', async t => {
204
+ t.test('baseline (rc)', t => {
205
+ t.plan(2)
206
+
207
+ const fastify = Fastify()
208
+ Object.defineProperty(fastify, 'version', {
209
+ value: '99.0.0-rc.1'
210
+ })
211
+
212
+ plugin[Symbol.for('plugin-meta')] = {
213
+ name: 'plugin',
214
+ fastify: '^98.1.0'
215
+ }
216
+ plugin2[Symbol.for('plugin-meta')] = {
217
+ name: 'plugin2',
218
+ fastify: '98.x'
219
+ }
220
+
221
+ fastify.register(plugin)
222
+
223
+ fastify.ready((err) => {
224
+ t.error(err)
225
+ t.pass('everything right')
226
+ })
227
+
228
+ function plugin (instance, opts, done) {
229
+ done()
230
+ }
231
+
232
+ function plugin2 (instance, opts, done) {
233
+ done()
234
+ }
206
235
  })
207
236
 
208
- plugin[Symbol.for('plugin-meta')] = {
209
- name: 'plugin',
210
- fastify: '^98.1.0'
211
- }
212
- plugin2[Symbol.for('plugin-meta')] = {
213
- name: 'plugin2',
214
- fastify: '98.x'
215
- }
237
+ t.test('pre', t => {
238
+ t.plan(2)
216
239
 
217
- fastify.register(plugin)
240
+ const fastify = Fastify()
241
+ Object.defineProperty(fastify, 'version', { value: '99.0.0-pre.1' })
218
242
 
219
- fastify.ready((err) => {
220
- t.error(err)
221
- t.pass('everything right')
243
+ plugin[Symbol.for('plugin-meta')] = { name: 'plugin', fastify: '^98.x' }
244
+
245
+ fastify.register(plugin)
246
+
247
+ fastify.ready((err) => {
248
+ t.error(err)
249
+ t.pass()
250
+ })
251
+
252
+ function plugin (instance, opts, done) { done() }
222
253
  })
223
254
 
224
- function plugin (instance, opts, done) {
225
- done()
226
- }
255
+ t.test('alpha', t => {
256
+ t.plan(2)
227
257
 
228
- function plugin2 (instance, opts, done) {
229
- done()
230
- }
258
+ const fastify = Fastify()
259
+ Object.defineProperty(fastify, 'version', { value: '99.0.0-pre.1' })
260
+
261
+ plugin[Symbol.for('plugin-meta')] = { name: 'plugin', fastify: '^98.x' }
262
+
263
+ fastify.register(plugin)
264
+
265
+ fastify.ready((err) => {
266
+ t.error(err)
267
+ t.pass()
268
+ })
269
+
270
+ function plugin (instance, opts, done) { done() }
271
+ })
231
272
  })
232
273
 
233
274
  test('hasPlugin method exists as a function', t => {
@@ -415,49 +456,44 @@ test('hasPlugin returns true when using encapsulation', async t => {
415
456
  await fastify.ready()
416
457
  })
417
458
 
418
- test('registering plugins with mixed style should return a warning', async t => {
419
- t.plan(12)
420
-
421
- const pluginNames = ['error-plugin', 'anonymous', 'anotherPlugin', 'anotherPluginNamed']
422
-
423
- const oldWarnings = process.listeners('warning')
424
- process.removeAllListeners('warning')
425
- process.on('warning', onWarning)
426
- function onWarning (warning) {
427
- t.match(warning.message, new RegExp(`.*${pluginNames.shift()} plugin being registered mixes async and callback styles.*`))
428
- t.equal(warning.name, 'FastifyWarning')
429
- t.equal(warning.code, 'FSTWRN002')
430
- }
431
- t.teardown(() => {
432
- process.removeListener('warning', onWarning)
433
- for (const warning of oldWarnings) {
434
- process.on('warning', warning)
435
- }
436
- })
459
+ test('registering anonymous plugin with mixed style should throw', async t => {
460
+ t.plan(2)
437
461
 
438
462
  const fastify = Fastify()
439
463
 
440
- const pluginName = 'error-plugin'
441
- const errorPlugin = async (app, opts, done) => {
464
+ const anonymousPlugin = async (app, opts, done) => {
442
465
  done()
443
466
  }
444
467
 
445
- const namedPlugin = fp(errorPlugin, { name: pluginName })
468
+ fastify.register(anonymousPlugin)
446
469
 
447
- async function anotherPlugin (app, opts, done) {
448
- done()
470
+ try {
471
+ await fastify.ready()
472
+ t.fail('should throw')
473
+ } catch (error) {
474
+ t.type(error, FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER)
475
+ t.equal(error.message, 'The anonymousPlugin plugin being registered mixes async and callback styles. Async plugin should not mix async and callback style.')
449
476
  }
477
+ })
478
+
479
+ test('registering named plugin with mixed style should throw', async t => {
480
+ t.plan(2)
481
+
482
+ const fastify = Fastify()
450
483
 
451
- const anotherPluginNamed = async function (app, opts, done) {
484
+ const pluginName = 'error-plugin'
485
+ const errorPlugin = async (app, opts, done) => {
452
486
  done()
453
487
  }
488
+ const namedPlugin = fp(errorPlugin, { name: pluginName })
454
489
 
455
490
  fastify.register(namedPlugin)
456
- fastify.register(async (app, opts, done) => {
457
- done()
458
- })
459
- fastify.register(anotherPlugin)
460
- fastify.register(anotherPluginNamed)
461
491
 
462
- await fastify.ready()
492
+ try {
493
+ await fastify.ready()
494
+ t.fail('should throw')
495
+ } catch (error) {
496
+ t.type(error, FST_ERR_PLUGIN_INVALID_ASYNC_HANDLER)
497
+ t.equal(error.message, 'The error-plugin plugin being registered mixes async and callback styles. Async plugin should not mix async and callback style.')
498
+ }
463
499
  })
@@ -1,7 +1,5 @@
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 sget = require('simple-get').concat
@@ -14,7 +12,7 @@ test('register', t => {
14
12
 
15
13
  fastify.register(function (instance, opts, done) {
16
14
  t.not(instance, fastify)
17
- t.ok(fastify.isPrototypeOf(instance))
15
+ t.ok(Object.prototype.isPrototypeOf.call(fastify, instance))
18
16
 
19
17
  t.equal(typeof opts, 'object')
20
18
  t.equal(typeof done, 'function')
@@ -27,7 +25,7 @@ test('register', t => {
27
25
 
28
26
  fastify.register(function (instance, opts, done) {
29
27
  t.not(instance, fastify)
30
- t.ok(fastify.isPrototypeOf(instance))
28
+ t.ok(Object.prototype.isPrototypeOf.call(fastify, instance))
31
29
 
32
30
  t.equal(typeof opts, 'object')
33
31
  t.equal(typeof done, 'function')
@@ -0,0 +1,98 @@
1
+ 'use strict'
2
+
3
+ const Fastify = require('..')
4
+ const { test } = require('tap')
5
+ const http = require('http')
6
+ const http2 = require('http2')
7
+
8
+ const testResBody = 'Hello, world!'
9
+
10
+ test('sends early hints', (t) => {
11
+ t.plan(6)
12
+
13
+ const fastify = Fastify({
14
+ logger: false
15
+ })
16
+
17
+ fastify.get('/', async (request, reply) => {
18
+ reply.writeEarlyHints({
19
+ link: '</styles.css>; rel=preload; as=style'
20
+ }, () => {
21
+ t.pass('callback called')
22
+ })
23
+
24
+ return testResBody
25
+ })
26
+
27
+ fastify.listen({ port: 0 }, (err, address) => {
28
+ t.error(err)
29
+
30
+ const req = http.get(address)
31
+
32
+ req.on('information', (res) => {
33
+ t.equal(res.statusCode, 103)
34
+ t.equal(res.headers.link, '</styles.css>; rel=preload; as=style')
35
+ })
36
+
37
+ req.on('response', (res) => {
38
+ t.equal(res.statusCode, 200)
39
+
40
+ let data = ''
41
+ res.on('data', (chunk) => {
42
+ data += chunk
43
+ })
44
+
45
+ res.on('end', () => {
46
+ t.equal(data, testResBody)
47
+ fastify.close(t.end)
48
+ })
49
+ })
50
+ })
51
+ })
52
+
53
+ test('sends early hints (http2)', (t) => {
54
+ t.plan(6)
55
+
56
+ const fastify = Fastify({
57
+ http2: true,
58
+ logger: false
59
+ })
60
+
61
+ fastify.get('/', async (request, reply) => {
62
+ reply.writeEarlyHints({
63
+ link: '</styles.css>; rel=preload; as=style'
64
+ })
65
+
66
+ return testResBody
67
+ })
68
+
69
+ fastify.listen({ port: 0 }, (err, address) => {
70
+ t.error(err)
71
+
72
+ const client = http2.connect(address)
73
+ const req = client.request()
74
+
75
+ req.on('headers', (headers) => {
76
+ t.not(headers, undefined)
77
+ t.equal(headers[':status'], 103)
78
+ t.equal(headers.link, '</styles.css>; rel=preload; as=style')
79
+ })
80
+
81
+ req.on('response', (headers) => {
82
+ t.equal(headers[':status'], 200)
83
+ })
84
+
85
+ let data = ''
86
+ req.on('data', (chunk) => {
87
+ data += chunk
88
+ })
89
+
90
+ req.on('end', () => {
91
+ t.equal(data, testResBody)
92
+ client.close()
93
+ fastify.close(t.end)
94
+ })
95
+
96
+ req.end()
97
+ })
98
+ })
@@ -603,7 +603,6 @@ test('error handler is triggered when a string is thrown from sync handler', t =
603
603
  const payload = 'error'
604
604
 
605
605
  fastify.get('/', function (req, reply) {
606
- // eslint-disable-next-line no-throw-literal
607
606
  throw throwable
608
607
  })
609
608
 
@@ -666,7 +665,6 @@ test('should trigger error handlers if a sync route throws any non-error object'
666
665
  const payload = 'error'
667
666
 
668
667
  fastify.get('/', function async (req, reply) {
669
- // eslint-disable-next-line no-throw-literal
670
668
  throw throwable
671
669
  })
672
670
 
@@ -255,7 +255,6 @@ function testBeforeHandlerHook (hook) {
255
255
 
256
256
  fastify.get('/', {
257
257
  [hook]: async () => {
258
- // eslint-disable-next-line no-throw-literal
259
258
  throw myError
260
259
  }
261
260
  }, (req, reply) => {
@@ -0,0 +1,60 @@
1
+ 'use strict'
2
+
3
+ const t = require('tap')
4
+ const test = t.test
5
+ const sget = require('simple-get').concat
6
+ const Fastify = require('../fastify')
7
+ const supportedMethods = require('../lib/httpMethods').supportedMethods
8
+
9
+ test('route-shorthand', t => {
10
+ t.plan(supportedMethods.length + 1)
11
+ const test = t.test
12
+
13
+ for (const method of supportedMethods) {
14
+ test(`route-shorthand - ${method.toLowerCase()}`, t => {
15
+ t.plan(3)
16
+ const fastify = new Fastify()
17
+ fastify[method.toLowerCase()]('/', function (req, reply) {
18
+ t.equal(req.method, method)
19
+ reply.send()
20
+ })
21
+ fastify.listen({ port: 0 }, function (err) {
22
+ if (err) t.error(err)
23
+ t.teardown(() => { fastify.close() })
24
+ sget({
25
+ method,
26
+ url: 'http://localhost:' + fastify.server.address().port
27
+ }, (err, response, body) => {
28
+ t.error(err)
29
+ t.equal(response.statusCode, 200)
30
+ })
31
+ })
32
+ })
33
+ }
34
+
35
+ test('route-shorthand - all', t => {
36
+ t.plan(3 * supportedMethods.length)
37
+ const fastify = new Fastify()
38
+ let currentMethod = ''
39
+ fastify.all('/', function (req, reply) {
40
+ t.equal(req.method, currentMethod)
41
+ reply.send()
42
+ })
43
+ fastify.listen({ port: 0 }, async function (err) {
44
+ if (err) t.error(err)
45
+ t.teardown(() => { fastify.close() })
46
+ for (const method of supportedMethods) {
47
+ currentMethod = method
48
+ await new Promise(resolve => sget({
49
+ method,
50
+ url: 'http://localhost:' + fastify.server.address().port
51
+ }, (err, response, body) => {
52
+ t.error(err)
53
+ t.equal(response.statusCode, 200)
54
+ resolve()
55
+ })
56
+ )
57
+ }
58
+ })
59
+ })
60
+ })
@@ -704,7 +704,7 @@ test('Custom schema object should not trigger FST_ERR_SCH_DUPLICATE', async t =>
704
704
  })
705
705
 
706
706
  test('The default schema compilers should not be called when overwritten by the user', async t => {
707
- const Fastify = t.mock('../', {
707
+ const Fastify = t.mockRequire('../', {
708
708
  '@fastify/ajv-compiler': () => {
709
709
  t.fail('The default validator compiler should not be called')
710
710
  },
@@ -3,7 +3,7 @@
3
3
  const t = require('tap')
4
4
  const test = t.test
5
5
  const Fastify = require('..')
6
- const semver = require('semver')
6
+ const sget = require('simple-get').concat
7
7
  const undici = require('undici')
8
8
 
9
9
  test('listen should accept null port', t => {
@@ -72,7 +72,22 @@ test('listen should reject string port', async (t) => {
72
72
  }
73
73
  })
74
74
 
75
- test('abort signal', { skip: semver.lt(process.version, '16.0.0') }, t => {
75
+ test('Test for hostname and port', t => {
76
+ const app = Fastify()
77
+ t.teardown(app.close.bind(app))
78
+ app.get('/host', (req, res) => {
79
+ const host = 'localhost:8000'
80
+ t.equal(req.host, host)
81
+ t.equal(req.hostname, req.host.split(':')[0])
82
+ t.equal(req.port, Number(req.host.split(':')[1]))
83
+ res.send('ok')
84
+ })
85
+ app.listen({ port: 8000 }, () => {
86
+ sget('http://localhost:8000/host', () => { t.end() })
87
+ })
88
+ })
89
+
90
+ test('abort signal', t => {
76
91
  t.test('listen should not start server', t => {
77
92
  t.plan(2)
78
93
  function onClose (instance, done) {
@@ -68,7 +68,7 @@ test('onSend hook stream should work even if payload is not a proper stream', t
68
68
  child: () => { return spyLogger }
69
69
  }
70
70
 
71
- const fastify = Fastify({ logger: spyLogger })
71
+ const fastify = Fastify({ loggerInstance: spyLogger })
72
72
  fastify.get('/', function (req, reply) {
73
73
  reply.send({ hello: 'world' })
74
74
  })
@@ -3,16 +3,12 @@
3
3
  const t = require('tap')
4
4
  const test = t.test
5
5
  const sget = require('simple-get').concat
6
- const fs = require('node:fs')
7
6
  const errors = require('http-errors')
8
7
  const JSONStream = require('JSONStream')
9
- const send = require('send')
10
8
  const Readable = require('node:stream').Readable
11
9
  const split = require('split2')
12
- const semver = require('semver')
13
10
  const Fastify = require('..')
14
11
  const { kDisableRequestLogging } = require('../lib/symbols.js')
15
- const { getServerUrl } = require('./helper')
16
12
 
17
13
  test('Destroying streams prematurely should call abort method', t => {
18
14
  t.plan(7)
@@ -183,41 +179,3 @@ test('return a 404 if the stream emits a 404 error', t => {
183
179
  })
184
180
  })
185
181
  })
186
-
187
- test('should support send module 200 and 404', { skip: semver.gte(process.versions.node, '17.0.0') }, t => {
188
- t.plan(8)
189
- const fastify = Fastify()
190
-
191
- fastify.get('/', function (req, reply) {
192
- const stream = send(req.raw, __filename)
193
- reply.code(200).send(stream)
194
- })
195
-
196
- fastify.get('/error', function (req, reply) {
197
- const stream = send(req.raw, 'non-existing-file')
198
- reply.code(200).send(stream)
199
- })
200
-
201
- fastify.listen({ port: 0 }, err => {
202
- t.error(err)
203
- t.teardown(() => { fastify.close() })
204
-
205
- const url = getServerUrl(fastify)
206
-
207
- sget(url, function (err, response, data) {
208
- t.error(err)
209
- t.equal(response.headers['content-type'], 'application/javascript; charset=UTF-8')
210
- t.equal(response.statusCode, 200)
211
-
212
- fs.readFile(__filename, (err, expected) => {
213
- t.error(err)
214
- t.equal(expected.toString(), data.toString())
215
- })
216
- })
217
-
218
- sget(url + '/error', function (err, response) {
219
- t.error(err)
220
- t.equal(response.statusCode, 404)
221
- })
222
- })
223
- })
@@ -88,7 +88,7 @@ test('reply.send handles aborted requests', t => {
88
88
  child: () => { return spyLogger }
89
89
  }
90
90
  const fastify = Fastify({
91
- logger: spyLogger
91
+ loggerInstance: spyLogger
92
92
  })
93
93
 
94
94
  fastify.get('/', (req, reply) => {
@@ -136,7 +136,7 @@ test('request terminated should not crash fastify', t => {
136
136
  child: () => { return spyLogger }
137
137
  }
138
138
  const fastify = Fastify({
139
- logger: spyLogger
139
+ loggerInstance: spyLogger
140
140
  })
141
141
 
142
142
  fastify.get('/', async (req, reply) => {
@@ -26,9 +26,11 @@ const testRequestValues = (t, req, options) => {
26
26
  t.ok(req.ip, 'ip is defined')
27
27
  t.equal(req.ip, options.ip, 'gets ip from x-forwarded-for')
28
28
  }
29
- if (options.hostname) {
30
- t.ok(req.hostname, 'hostname is defined')
31
- t.equal(req.hostname, options.hostname, 'gets hostname from x-forwarded-host')
29
+ if (options.host) {
30
+ t.ok(req.host, 'host is defined')
31
+ t.equal(req.host, options.host, 'gets host from x-forwarded-host')
32
+ t.ok(req.hostname)
33
+ t.equal(req.hostname, options.host, 'gets hostname from x-forwarded-host')
32
34
  }
33
35
  if (options.ips) {
34
36
  t.same(req.ips, options.ips, 'gets ips from x-forwarded-for')
@@ -37,6 +39,10 @@ const testRequestValues = (t, req, options) => {
37
39
  t.ok(req.protocol, 'protocol is defined')
38
40
  t.equal(req.protocol, options.protocol, 'gets protocol from x-forwarded-proto')
39
41
  }
42
+ if (options.port) {
43
+ t.ok(req.port, 'port is defined')
44
+ t.equal(req.port, options.port, 'port is taken from x-forwarded-for or host')
45
+ }
40
46
  }
41
47
 
42
48
  let localhost
@@ -45,18 +51,18 @@ before(async function () {
45
51
  })
46
52
 
47
53
  test('trust proxy, not add properties to node req', (t) => {
48
- t.plan(8)
54
+ t.plan(14)
49
55
  const app = fastify({
50
56
  trustProxy: true
51
57
  })
52
58
  app.get('/trustproxy', function (req, reply) {
53
- testRequestValues(t, req, { ip: '1.1.1.1', hostname: 'example.com' })
54
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
59
+ testRequestValues(t, req, { ip: '1.1.1.1', host: 'example.com', port: app.server.address().port })
60
+ reply.code(200).send({ ip: req.ip, host: req.host })
55
61
  })
56
62
 
57
63
  app.get('/trustproxychain', function (req, reply) {
58
- testRequestValues(t, req, { ip: '2.2.2.2', ips: [localhost, '1.1.1.1', '2.2.2.2'] })
59
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
64
+ testRequestValues(t, req, { ip: '2.2.2.2', ips: [localhost, '1.1.1.1', '2.2.2.2'], port: app.server.address().port })
65
+ reply.code(200).send({ ip: req.ip, host: req.host })
60
66
  })
61
67
 
62
68
  t.teardown(app.close.bind(app))
@@ -70,14 +76,14 @@ test('trust proxy, not add properties to node req', (t) => {
70
76
  })
71
77
 
72
78
  test('trust proxy chain', (t) => {
73
- t.plan(3)
79
+ t.plan(9)
74
80
  const app = fastify({
75
81
  trustProxy: [localhost, '192.168.1.1']
76
82
  })
77
83
 
78
84
  app.get('/trustproxychain', function (req, reply) {
79
- testRequestValues(t, req, { ip: '1.1.1.1' })
80
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
85
+ testRequestValues(t, req, { ip: '1.1.1.1', host: 'example.com', port: app.server.address().port })
86
+ reply.code(200).send({ ip: req.ip, host: req.host })
81
87
  })
82
88
 
83
89
  t.teardown(app.close.bind(app))
@@ -90,13 +96,13 @@ test('trust proxy chain', (t) => {
90
96
  })
91
97
 
92
98
  test('trust proxy function', (t) => {
93
- t.plan(3)
99
+ t.plan(9)
94
100
  const app = fastify({
95
101
  trustProxy: (address) => address === localhost
96
102
  })
97
103
  app.get('/trustproxyfunc', function (req, reply) {
98
- testRequestValues(t, req, { ip: '1.1.1.1' })
99
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
104
+ testRequestValues(t, req, { ip: '1.1.1.1', host: 'example.com', port: app.server.address().port })
105
+ reply.code(200).send({ ip: req.ip, host: req.host })
100
106
  })
101
107
 
102
108
  t.teardown(app.close.bind(app))
@@ -109,13 +115,13 @@ test('trust proxy function', (t) => {
109
115
  })
110
116
 
111
117
  test('trust proxy number', (t) => {
112
- t.plan(4)
118
+ t.plan(10)
113
119
  const app = fastify({
114
120
  trustProxy: 1
115
121
  })
116
122
  app.get('/trustproxynumber', function (req, reply) {
117
- testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'] })
118
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
123
+ testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'], host: 'example.com', port: app.server.address().port })
124
+ reply.code(200).send({ ip: req.ip, host: req.host })
119
125
  })
120
126
 
121
127
  t.teardown(app.close.bind(app))
@@ -128,13 +134,13 @@ test('trust proxy number', (t) => {
128
134
  })
129
135
 
130
136
  test('trust proxy IP addresses', (t) => {
131
- t.plan(4)
137
+ t.plan(10)
132
138
  const app = fastify({
133
139
  trustProxy: `${localhost}, 2.2.2.2`
134
140
  })
135
141
  app.get('/trustproxyipaddrs', function (req, reply) {
136
- testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'] })
137
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
142
+ testRequestValues(t, req, { ip: '1.1.1.1', ips: [localhost, '1.1.1.1'], host: 'example.com', port: app.server.address().port })
143
+ reply.code(200).send({ ip: req.ip, host: req.host })
138
144
  })
139
145
 
140
146
  t.teardown(app.close.bind(app))
@@ -147,21 +153,21 @@ test('trust proxy IP addresses', (t) => {
147
153
  })
148
154
 
149
155
  test('trust proxy protocol', (t) => {
150
- t.plan(13)
156
+ t.plan(31)
151
157
  const app = fastify({
152
158
  trustProxy: true
153
159
  })
154
160
  app.get('/trustproxyprotocol', function (req, reply) {
155
- testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'lorem' })
156
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
161
+ testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'lorem', host: 'example.com', port: app.server.address().port })
162
+ reply.code(200).send({ ip: req.ip, host: req.host })
157
163
  })
158
164
  app.get('/trustproxynoprotocol', function (req, reply) {
159
- testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'http' })
160
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
165
+ testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'http', host: 'example.com', port: app.server.address().port })
166
+ reply.code(200).send({ ip: req.ip, host: req.host })
161
167
  })
162
168
  app.get('/trustproxyprotocols', function (req, reply) {
163
- testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'dolor' })
164
- reply.code(200).send({ ip: req.ip, hostname: req.hostname })
169
+ testRequestValues(t, req, { ip: '1.1.1.1', protocol: 'dolor', host: 'example.com', port: app.server.address().port })
170
+ reply.code(200).send({ ip: req.ip, host: req.host })
165
171
  })
166
172
 
167
173
  t.teardown(app.close.bind(app))