@fastify/reply-from 12.1.0 → 12.3.0

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 (108) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.github/workflows/ci.yml +3 -0
  3. package/LICENSE +4 -1
  4. package/README.md +20 -0
  5. package/index.js +10 -0
  6. package/lib/request.js +13 -3
  7. package/lib/utils.js +1 -0
  8. package/package.json +6 -8
  9. package/test/async-route-handler.test.js +29 -32
  10. package/test/balanced-pool.test.js +48 -0
  11. package/test/base-get.test.js +27 -30
  12. package/test/base-path.test.js +27 -24
  13. package/test/base-querystring.test.js +27 -30
  14. package/test/build-url.test.js +17 -15
  15. package/test/core-with-path-in-base.test.js +30 -33
  16. package/test/custom-undici-instance.test.js +28 -36
  17. package/test/disable-request-logging.test.js +38 -52
  18. package/test/fastify-multipart-incompatibility.test.js +43 -49
  19. package/test/fix-GHSA-v2v2-hph8-q5xp.test.js +3 -2
  20. package/test/full-delete-http2.test.js +12 -11
  21. package/test/full-get-test.test.js +27 -30
  22. package/test/full-https-get.test.js +30 -30
  23. package/test/full-post-extended-content-type.test.js +40 -44
  24. package/test/full-post-http2.test.js +18 -13
  25. package/test/full-post-stream-core.test.js +39 -43
  26. package/test/full-post-stream.test.js +39 -43
  27. package/test/full-post.test.js +36 -38
  28. package/test/full-querystring-rewrite-option-complex.test.js +27 -31
  29. package/test/full-querystring-rewrite-option-function-request.test.js +30 -36
  30. package/test/full-querystring-rewrite-option-function.test.js +30 -33
  31. package/test/full-querystring-rewrite-option.test.js +28 -31
  32. package/test/full-querystring-rewrite-string.test.js +27 -30
  33. package/test/full-querystring-rewrite.test.js +27 -30
  34. package/test/full-querystring.test.js +27 -30
  35. package/test/full-rewrite-body-content-type.test.js +37 -41
  36. package/test/full-rewrite-body-http.test.js +39 -43
  37. package/test/full-rewrite-body-to-empty-string.test.js +37 -41
  38. package/test/full-rewrite-body-to-null.test.js +37 -41
  39. package/test/full-rewrite-body.test.js +39 -43
  40. package/test/get-upstream-cache.test.js +12 -11
  41. package/test/get-upstream-http.test.js +35 -41
  42. package/test/get-upstream-type.test.js +24 -27
  43. package/test/get-upstream-undici.test.js +23 -26
  44. package/test/host-header.test.js +22 -18
  45. package/test/http-agents.test.js +27 -30
  46. package/test/http-global-agent.test.js +20 -33
  47. package/test/http-http2.test.js +13 -18
  48. package/test/http-invalid-target.test.js +13 -17
  49. package/test/http-retry.test.js +22 -29
  50. package/test/http-timeout.test.js +49 -42
  51. package/test/http2-canceled-streams-cleanup.test.js +117 -0
  52. package/test/http2-goaway.test.js +126 -0
  53. package/test/http2-http2.test.js +8 -8
  54. package/test/http2-https.test.js +29 -27
  55. package/test/http2-invalid-base.test.js +2 -2
  56. package/test/http2-invalid-target.test.js +13 -17
  57. package/test/http2-target-crash.test.js +16 -20
  58. package/test/http2-target-multi-crash.test.js +22 -27
  59. package/test/http2-timeout-disabled.test.js +20 -15
  60. package/test/http2-timeout.test.js +58 -65
  61. package/test/http2-unix-socket.test.js +2 -2
  62. package/test/https-agents.test.js +31 -30
  63. package/test/https-global-agent.test.js +22 -31
  64. package/test/method.test.js +37 -42
  65. package/test/modifyCoreObjects-false.test.js +27 -30
  66. package/test/no-body-opts-with-get.test.js +25 -31
  67. package/test/no-body-opts-with-head.test.js +28 -32
  68. package/test/no-stream-body-option.test.js +34 -36
  69. package/test/on-error.test.js +21 -23
  70. package/test/on-invalid-upstream-response.test.js +30 -37
  71. package/test/onResponse.test.js +25 -32
  72. package/test/padded-body.test.js +38 -43
  73. package/test/post-formbody.test.js +35 -40
  74. package/test/post-plain-text.test.js +35 -39
  75. package/test/post-with-custom-encoded-contenttype.test.js +37 -39
  76. package/test/post-with-octet-stream.test.js +18 -88
  77. package/test/retry-on-503.test.js +27 -26
  78. package/test/retry-with-a-custom-handler.test.js +33 -40
  79. package/test/rewrite-headers-type.test.js +24 -29
  80. package/test/rewrite-headers.test.js +31 -36
  81. package/test/rewrite-request-headers-type.test.js +25 -28
  82. package/test/rewrite-request-headers.test.js +26 -30
  83. package/test/transform-body.test.js +37 -43
  84. package/test/undici-agent.test.js +27 -31
  85. package/test/undici-body.test.js +37 -42
  86. package/test/undici-chaining.test.js +35 -42
  87. package/test/undici-connect-timeout.test.js +13 -13
  88. package/test/undici-custom-dispatcher.test.js +11 -11
  89. package/test/undici-global-agent.test.js +14 -33
  90. package/test/undici-no-destroy.test.js +2 -2
  91. package/test/undici-options.test.js +21 -24
  92. package/test/undici-proxy-agent.test.js +4 -3
  93. package/test/undici-retry.test.js +24 -31
  94. package/test/undici-timeout-body-partial.test.js +14 -16
  95. package/test/undici-timeout-body.test.js +17 -19
  96. package/test/undici-timeout.test.js +41 -37
  97. package/test/undici-with-path-in-base.test.js +28 -31
  98. package/test/undici.test.js +28 -31
  99. package/test/unexpected-error.test.js +13 -18
  100. package/test/unix-http-undici-from.test.js +22 -31
  101. package/test/unix-http-undici.test.js +32 -40
  102. package/test/unix-http.test.js +31 -39
  103. package/test/unix-https-undici.test.js +30 -35
  104. package/test/unix-https.test.js +35 -40
  105. package/types/index.d.ts +9 -2
  106. package/types/index.test-d.ts +3 -4
  107. package/test/get-with-body.test.js +0 -55
  108. package/test/head-with-body.test.js +0 -57
@@ -1,14 +1,14 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const From = require('..')
6
- const got = require('got')
7
7
 
8
8
  test('http -> http2 crash multiple times', async (t) => {
9
9
  const instance = Fastify()
10
10
 
11
- t.teardown(instance.close.bind(instance))
11
+ t.after(() => instance.close())
12
12
 
13
13
  instance.get('/', (_request, reply) => {
14
14
  reply.from()
@@ -23,29 +23,24 @@ test('http -> http2 crash multiple times', async (t) => {
23
23
  })
24
24
 
25
25
  await instance.listen({ port: 0 })
26
-
27
- try {
28
- let target = setupTarget()
29
- await target.listen({ port: 3128 })
30
- await got(`http://localhost:${instance.server.address().port}`)
31
- await target.close()
32
- target = setupTarget()
33
- await target.listen({ port: 3128 })
34
- await got(`http://localhost:${instance.server.address().port}`)
35
- await target.close()
36
- await got(`http://localhost:${instance.server.address().port}`)
37
- } catch (err) {
38
- t.equal(err.response.statusCode, 503)
39
- t.match(err.response.headers['content-type'], /application\/json/)
40
- t.same(JSON.parse(err.response.body), {
41
- statusCode: 503,
42
- code: 'FST_REPLY_FROM_SERVICE_UNAVAILABLE',
43
- error: 'Service Unavailable',
44
- message: 'Service Unavailable'
45
- })
46
- return
47
- }
48
- t.fail()
26
+ let target = setupTarget()
27
+ await target.listen({ port: 3128 })
28
+ await request(`http://localhost:${instance.server.address().port}`)
29
+ await target.close()
30
+ target = setupTarget()
31
+ await target.listen({ port: 3128 })
32
+ await request(`http://localhost:${instance.server.address().port}`)
33
+ await target.close()
34
+ const result = await request(`http://localhost:${instance.server.address().port}`)
35
+
36
+ t.assert.strictEqual(result.statusCode, 503)
37
+ t.assert.match(result.headers['content-type'], /application\/json/)
38
+ t.assert.deepStrictEqual(await result.body.json(), {
39
+ statusCode: 503,
40
+ code: 'FST_REPLY_FROM_SERVICE_UNAVAILABLE',
41
+ error: 'Service Unavailable',
42
+ message: 'Service Unavailable'
43
+ })
49
44
 
50
45
  function setupTarget () {
51
46
  const target = Fastify({
@@ -53,7 +48,7 @@ test('http -> http2 crash multiple times', async (t) => {
53
48
  })
54
49
 
55
50
  target.get('/', (request, reply) => {
56
- t.pass('request proxied')
51
+ t.assert.ok('request proxied')
57
52
  reply.code(200).send({
58
53
  hello: 'world'
59
54
  })
@@ -1,22 +1,22 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request, Agent } = require('undici')
5
6
  const From = require('..')
6
- const got = require('got')
7
7
 
8
8
  test('http2 request timeout disabled', async (t) => {
9
9
  const target = Fastify({ http2: true })
10
- t.teardown(target.close.bind(target))
10
+ t.after(() => target.close())
11
11
 
12
12
  target.get('/', () => {
13
- t.pass('request arrives')
13
+ t.assert.ok('request arrives')
14
14
  })
15
15
 
16
16
  await target.listen({ port: 0 })
17
17
 
18
18
  const instance = Fastify()
19
- t.teardown(instance.close.bind(instance))
19
+ t.after(() => instance.close())
20
20
 
21
21
  instance.register(From, {
22
22
  base: `http://localhost:${target.server.address().port}`,
@@ -30,22 +30,24 @@ test('http2 request timeout disabled', async (t) => {
30
30
  await instance.listen({ port: 0 })
31
31
 
32
32
  const result = await Promise.race([
33
- got.get(`http://localhost:${instance.server.address().port}/`, {
34
- retry: 0
33
+ request(`http://localhost:${instance.server.address().port}/`, {
34
+ dispatcher: new Agent({
35
+ pipelining: 0
36
+ })
35
37
  }),
36
38
  new Promise(resolve => setTimeout(resolve, 11000, 'passed'))
37
39
  ])
38
40
 
39
41
  // if we wait 11000 ms without a timeout error, we assume disabling the timeout worked
40
42
  // 10000 ms is the default timeout
41
- t.equal(result, 'passed')
43
+ t.assert.strictEqual(result, 'passed')
42
44
  })
43
45
 
44
46
  test('http2 session timeout disabled', async (t) => {
45
47
  const target = Fastify({ http2: true })
46
48
 
47
49
  target.get('/', () => {
48
- t.pass('request arrives')
50
+ t.assert.ok('request arrives')
49
51
  })
50
52
 
51
53
  await target.listen({ port: 0 })
@@ -65,21 +67,24 @@ test('http2 session timeout disabled', async (t) => {
65
67
 
66
68
  await instance.listen({ port: 0 })
67
69
 
68
- const request = got.get(`http://localhost:${instance.server.address().port}/`, {
69
- retry: 0
70
- })
70
+ const abortController = new AbortController()
71
71
 
72
72
  const result = await Promise.race([
73
- request,
73
+ request(`http://localhost:${instance.server.address().port}/`, {
74
+ dispatcher: new Agent({
75
+ pipelining: 0
76
+ }),
77
+ signal: abortController.signal
78
+ }),
74
79
  new Promise(resolve => setTimeout(resolve, 4000, 'passed'))
75
80
  ])
76
81
 
77
82
  // clean up right after the timeout, otherwise test will hang
78
- request.cancel()
83
+ abortController.abort()
79
84
  target.close()
80
85
  instance.close()
81
86
 
82
87
  // if we wait 4000 ms without a timeout error, we assume disabling the session timeout for reply-from worked
83
88
  // because we pass 3000 ms as session timeout to the Fastify options itself
84
- t.equal(result, 'passed')
89
+ t.assert.strictEqual(result, 'passed')
85
90
  })
@@ -1,23 +1,23 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request, Agent } = require('undici')
5
6
  const From = require('..')
6
- const got = require('got')
7
7
  const FakeTimers = require('@sinonjs/fake-timers')
8
8
 
9
9
  test('http2 request timeout', async (t) => {
10
10
  const target = Fastify({ http2: true, sessionTimeout: 0 })
11
- t.teardown(target.close.bind(target))
11
+ t.after(() => target.close())
12
12
 
13
13
  target.get('/', () => {
14
- t.pass('request arrives')
14
+ t.assert.ok('request arrives')
15
15
  })
16
16
 
17
17
  await target.listen({ port: 0 })
18
18
 
19
19
  const instance = Fastify()
20
- t.teardown(instance.close.bind(instance))
20
+ t.after(() => instance.close())
21
21
 
22
22
  instance.register(From, {
23
23
  base: `http://localhost:${target.server.address().port}`,
@@ -30,33 +30,28 @@ test('http2 request timeout', async (t) => {
30
30
 
31
31
  await instance.listen({ port: 0 })
32
32
 
33
- try {
34
- await got.get(`http://localhost:${instance.server.address().port}/`, {
35
- retry: 0
33
+ const result = await request(`http://localhost:${instance.server.address().port}/`, {
34
+ dispatcher: new Agent({
35
+ pipelining: 0
36
36
  })
37
- } catch (err) {
38
- t.equal(err.response.statusCode, 504)
39
- t.match(err.response.headers['content-type'], /application\/json/)
40
- t.same(JSON.parse(err.response.body), {
41
- statusCode: 504,
42
- code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
43
- error: 'Gateway Timeout',
44
- message: 'Gateway Timeout'
45
- })
46
-
47
- return
48
- }
49
-
50
- t.fail()
37
+ })
38
+ t.assert.strictEqual(result.statusCode, 504)
39
+ t.assert.match(result.headers['content-type'], /application\/json/)
40
+ t.assert.deepStrictEqual(await result.body.json(), {
41
+ statusCode: 504,
42
+ code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
43
+ error: 'Gateway Timeout',
44
+ message: 'Gateway Timeout'
45
+ })
51
46
  })
52
47
 
53
48
  test('http2 request with specific timeout', async (t) => {
54
49
  const clock = FakeTimers.createClock()
55
50
  const target = Fastify({ http2: true })
56
- t.teardown(target.close.bind(target))
51
+ t.after(() => target.close())
57
52
 
58
53
  target.get('/', (_request, reply) => {
59
- t.pass('request arrives')
54
+ t.assert.ok('request arrives')
60
55
 
61
56
  setTimeout(() => {
62
57
  reply.status(200).send('hello world')
@@ -68,7 +63,7 @@ test('http2 request with specific timeout', async (t) => {
68
63
  await target.listen({ port: 0 })
69
64
 
70
65
  const instance = Fastify()
71
- t.teardown(instance.close.bind(instance))
66
+ t.after(() => instance.close())
72
67
 
73
68
  instance.register(From, {
74
69
  base: `http://localhost:${target.server.address().port}`,
@@ -87,38 +82,40 @@ test('http2 request with specific timeout', async (t) => {
87
82
  })
88
83
 
89
84
  await instance.listen({ port: 0 })
90
- const { statusCode } = await got.get(`http://localhost:${instance.server.address().port}/success`, { retry: 0 })
91
- t.equal(statusCode, 200)
92
-
93
- try {
94
- await got.get(`http://localhost:${instance.server.address().port}/fail`, { retry: 0 })
95
- } catch (err) {
96
- t.equal(err.response.statusCode, 504)
97
- t.match(err.response.headers['content-type'], /application\/json/)
98
- t.same(JSON.parse(err.response.body), {
99
- statusCode: 504,
100
- code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
101
- error: 'Gateway Timeout',
102
- message: 'Gateway Timeout'
85
+ const result = await request(`http://localhost:${instance.server.address().port}/success`, {
86
+ dispatcher: new Agent({
87
+ pipelining: 0
103
88
  })
104
- return
105
- }
89
+ })
90
+ t.assert.strictEqual(result.statusCode, 200)
106
91
 
107
- t.fail()
92
+ const result2 = await request(`http://localhost:${instance.server.address().port}/fail`, {
93
+ dispatcher: new Agent({
94
+ pipelining: 0
95
+ })
96
+ })
97
+ t.assert.strictEqual(result2.statusCode, 504)
98
+ t.assert.match(result2.headers['content-type'], /application\/json/)
99
+ t.assert.deepStrictEqual(await result2.body.json(), {
100
+ statusCode: 504,
101
+ code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
102
+ error: 'Gateway Timeout',
103
+ message: 'Gateway Timeout'
104
+ })
108
105
  })
109
106
 
110
107
  test('http2 session timeout', async (t) => {
111
108
  const target = Fastify({ http2: true, sessionTimeout: 0 })
112
- t.teardown(target.close.bind(target))
109
+ t.after(() => target.close())
113
110
 
114
111
  target.get('/', () => {
115
- t.pass('request arrives')
112
+ t.assert.ok('request arrives')
116
113
  })
117
114
 
118
115
  await target.listen({ port: 0 })
119
116
 
120
117
  const instance = Fastify()
121
- t.teardown(instance.close.bind(instance))
118
+ t.after(() => instance.close())
122
119
 
123
120
  instance.register(From, {
124
121
  base: `http://localhost:${target.server.address().port}`,
@@ -131,31 +128,27 @@ test('http2 session timeout', async (t) => {
131
128
 
132
129
  await instance.listen({ port: 0 })
133
130
 
134
- try {
135
- await got.get(`http://localhost:${instance.server.address().port}/`, {
136
- retry: 0
137
- })
138
- } catch (err) {
139
- t.equal(err.response.statusCode, 504)
140
- t.match(err.response.headers['content-type'], /application\/json/)
141
- t.same(JSON.parse(err.response.body), {
142
- statusCode: 504,
143
- code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
144
- error: 'Gateway Timeout',
145
- message: 'Gateway Timeout'
131
+ const result = await request(`http://localhost:${instance.server.address().port}/`, {
132
+ dispatcher: new Agent({
133
+ pipelining: 0
146
134
  })
135
+ })
147
136
 
148
- return
149
- }
150
-
151
- t.fail()
137
+ t.assert.strictEqual(result.statusCode, 504)
138
+ t.assert.match(result.headers['content-type'], /application\/json/)
139
+ t.assert.deepStrictEqual(await result.body.json(), {
140
+ statusCode: 504,
141
+ code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
142
+ error: 'Gateway Timeout',
143
+ message: 'Gateway Timeout'
144
+ })
152
145
  })
153
146
 
154
147
  test('http2 sse removes request and session timeout test', async (t) => {
155
148
  const target = Fastify({ http2: true, sessionTimeout: 0 })
156
149
 
157
150
  target.get('/', (_request, reply) => {
158
- t.pass('request arrives')
151
+ t.assert.ok('request arrives')
159
152
 
160
153
  reply.status(200).header('content-type', 'text/event-stream').send('hello world')
161
154
  })
@@ -175,11 +168,11 @@ test('http2 sse removes request and session timeout test', async (t) => {
175
168
 
176
169
  await instance.listen({ port: 0 })
177
170
 
178
- t.teardown(instance.close.bind(instance))
179
- t.teardown(target.close.bind(target))
171
+ t.after(() => instance.close())
172
+ t.after(() => target.close())
180
173
 
181
- const { statusCode } = await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
182
- t.equal(statusCode, 200)
174
+ const { statusCode } = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
175
+ t.assert.strictEqual(statusCode, 200)
183
176
  instance.close()
184
177
  target.close()
185
178
  })
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
5
  const From = require('../index')
6
6
 
@@ -9,7 +9,7 @@ test('throw an error if http2 is used with a Unix socket destination', async t =
9
9
 
10
10
  const instance = Fastify()
11
11
 
12
- await t.rejects(async () => instance.register(From, {
12
+ await t.assert.rejects(async () => instance.register(From, {
13
13
  base: 'unix+http://localhost:1337',
14
14
  http2: { requestTimeout: 100 }
15
15
  }), new Error('Unix socket destination is not supported when http2 is true'))
@@ -1,11 +1,12 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const From = require('..')
6
7
  const http = require('node:http')
7
8
  const https = require('node:https')
8
- const get = require('simple-get').concat
9
+ const { Agent } = require('undici')
9
10
 
10
11
  const fs = require('node:fs')
11
12
  const path = require('node:path')
@@ -18,27 +19,27 @@ const instance = Fastify({
18
19
  https: certs
19
20
  })
20
21
 
21
- t.plan(10)
22
- t.teardown(instance.close.bind(instance))
22
+ t.test('https agents', async (t) => {
23
+ t.plan(7)
24
+ t.after(() => instance.close())
23
25
 
24
- const target = https.createServer(certs, (req, res) => {
25
- t.pass('request proxied')
26
- t.equal(req.method, 'GET')
27
- t.equal(req.url, '/')
28
- res.statusCode = 205
29
- res.setHeader('Content-Type', 'text/plain')
30
- res.setHeader('x-my-header', 'hello!')
31
- res.end('hello world')
32
- })
26
+ const target = https.createServer(certs, (req, res) => {
27
+ t.assert.ok('request proxied')
28
+ t.assert.strictEqual(req.method, 'GET')
29
+ t.assert.strictEqual(req.url, '/')
30
+ res.statusCode = 205
31
+ res.setHeader('Content-Type', 'text/plain')
32
+ res.setHeader('x-my-header', 'hello!')
33
+ res.end('hello world')
34
+ })
33
35
 
34
- instance.get('/', (_request, reply) => {
35
- reply.from()
36
- })
36
+ instance.get('/', (_request, reply) => {
37
+ reply.from()
38
+ })
37
39
 
38
- t.teardown(target.close.bind(target))
40
+ t.after(() => target.close())
39
41
 
40
- target.listen({ port: 0 }, (err) => {
41
- t.error(err)
42
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
42
43
 
43
44
  instance.register(From, {
44
45
  base: `https://localhost:${target.address().port}`,
@@ -50,18 +51,18 @@ target.listen({ port: 0 }, (err) => {
50
51
  }
51
52
  })
52
53
 
53
- instance.listen({ port: 0 }, (err) => {
54
- t.error(err)
54
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
55
55
 
56
- get({
57
- url: `https://localhost:${instance.server.address().port}`,
58
- rejectUnauthorized: false
59
- }, (err, res, data) => {
60
- t.error(err)
61
- t.equal(res.headers['content-type'], 'text/plain')
62
- t.equal(res.headers['x-my-header'], 'hello!')
63
- t.equal(res.statusCode, 205)
64
- t.equal(data.toString(), 'hello world')
56
+ const result = await request(`https://localhost:${instance.server.address().port}`, {
57
+ dispatcher: new Agent({
58
+ connect: {
59
+ rejectUnauthorized: false
60
+ }
65
61
  })
66
62
  })
63
+
64
+ t.assert.strictEqual(result.headers['content-type'], 'text/plain')
65
+ t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
66
+ t.assert.strictEqual(result.statusCode, 205)
67
+ t.assert.strictEqual(await result.body.text(), 'hello world')
67
68
  })
@@ -1,10 +1,11 @@
1
1
  'use strict'
2
2
 
3
- const { test } = require('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const From = require('..')
6
7
  const https = require('node:https')
7
- const get = require('simple-get').concat
8
+ const { Agent } = require('undici')
8
9
 
9
10
  const fs = require('node:fs')
10
11
  const path = require('node:path')
@@ -20,50 +21,40 @@ test('https global agent is used, but not destroyed', async (t) => {
20
21
  const instance = Fastify({
21
22
  https: certs
22
23
  })
23
- t.teardown(instance.close.bind(instance))
24
+ t.after(() => instance.close())
24
25
  instance.get('/', (_request, reply) => {
25
26
  reply.from()
26
27
  })
27
28
 
28
29
  const target = https.createServer(certs, (req, res) => {
29
- t.pass('request proxied')
30
- t.equal(req.method, 'GET')
31
- t.equal(req.url, '/')
30
+ t.assert.ok('request proxied')
31
+ t.assert.strictEqual(req.method, 'GET')
32
+ t.assert.strictEqual(req.url, '/')
32
33
  res.statusCode = 200
33
34
  res.end()
34
35
  })
35
- t.teardown(target.close.bind(target))
36
+ t.after(() => target.close())
36
37
 
37
- const executionFlow = () => new Promise((resolve) => {
38
- target.listen({ port: 0 }, (err) => {
39
- t.error(err)
38
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
40
39
 
41
- instance.register(From, {
42
- base: `https://localhost:${target.address().port}`,
43
- globalAgent: true,
44
- http: {
45
- }
46
- })
40
+ instance.register(From, {
41
+ base: `https://localhost:${target.address().port}`,
42
+ globalAgent: true,
43
+ http: {
44
+ }
45
+ })
47
46
 
48
- instance.listen({ port: 0 }, (err) => {
49
- t.error(err)
47
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
50
48
 
51
- get(
52
- {
53
- url: `https://localhost:${instance.server.address().port}`,
54
- rejectUnauthorized: false
55
- },
56
- (err, res) => {
57
- t.error(err)
58
- t.equal(res.statusCode, 200)
59
- resolve()
60
- }
61
- )
62
- })
49
+ const result = await request(`https://localhost:${instance.server.address().port}`, {
50
+ dispatcher: new Agent({
51
+ connect: {
52
+ rejectUnauthorized: false
53
+ }
63
54
  })
64
55
  })
65
56
 
66
- await executionFlow()
57
+ t.assert.strictEqual(result.statusCode, 200)
67
58
 
68
59
  target.close()
69
60
  })
@@ -1,46 +1,46 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
3
+ const t = require('node:test')
4
4
  const Fastify = require('fastify')
5
+ const { request } = require('undici')
5
6
  const From = require('..')
6
7
  const http = require('node:http')
7
- const get = require('simple-get').concat
8
8
 
9
9
  const instance = Fastify()
10
10
 
11
- t.plan(9)
12
- t.teardown(instance.close.bind(instance))
11
+ t.test('method', async (t) => {
12
+ t.plan(6)
13
+ t.after(() => instance.close())
13
14
 
14
- const bodyString = JSON.stringify({ hello: 'world' })
15
+ const bodyString = JSON.stringify({ hello: 'world' })
15
16
 
16
- const parsedLength = Buffer.byteLength(bodyString)
17
+ const parsedLength = Buffer.byteLength(bodyString)
17
18
 
18
- const target = http.createServer((req, res) => {
19
- t.pass('request proxied')
20
- t.equal(req.method, 'POST')
21
- t.equal(req.headers['content-type'], 'application/json')
22
- t.same(req.headers['content-length'], parsedLength)
23
- let data = ''
24
- req.setEncoding('utf8')
25
- req.on('data', (d) => {
26
- data += d
27
- })
28
- req.on('end', () => {
29
- t.same(JSON.parse(data), { hello: 'world' })
30
- res.statusCode = 200
31
- res.setHeader('content-type', 'application/json')
32
- res.end(JSON.stringify({ something: 'else' }))
19
+ const target = http.createServer((req, res) => {
20
+ t.assert.ok('request proxied')
21
+ t.assert.deepStrictEqual(req.method, 'POST')
22
+ t.assert.deepStrictEqual(req.headers['content-type'], 'application/json')
23
+ t.assert.deepStrictEqual(req.headers['content-length'], `${parsedLength}`)
24
+ let data = ''
25
+ req.setEncoding('utf8')
26
+ req.on('data', (d) => {
27
+ data += d
28
+ })
29
+ req.on('end', () => {
30
+ t.assert.deepStrictEqual(JSON.parse(data), { hello: 'world' })
31
+ res.statusCode = 200
32
+ res.setHeader('content-type', 'application/json')
33
+ res.end(JSON.stringify({ something: 'else' }))
34
+ })
33
35
  })
34
- })
35
36
 
36
- instance.patch('/', (_request, reply) => {
37
- reply.from(`http://localhost:${target.address().port}`, { method: 'POST' })
38
- })
37
+ instance.patch('/', (_request, reply) => {
38
+ reply.from(`http://localhost:${target.address().port}`, { method: 'POST' })
39
+ })
39
40
 
40
- t.teardown(target.close.bind(target))
41
+ t.after(() => target.close())
41
42
 
42
- target.listen({ port: 0 }, (err) => {
43
- t.error(err)
43
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
44
44
 
45
45
  instance.addContentTypeParser('application/json', function (_req, payload, done) {
46
46
  done(null, payload)
@@ -51,20 +51,15 @@ target.listen({ port: 0 }, (err) => {
51
51
  undici: true
52
52
  })
53
53
 
54
- instance.listen({ port: 0 }, (err) => {
55
- t.error(err)
54
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
56
55
 
57
- get({
58
- url: `http://localhost:${instance.server.address().port}`,
59
- method: 'PATCH',
60
- headers: {
61
- 'content-type': 'application/json'
62
- },
63
- body: bodyString
64
- }, (err, _res, data) => {
65
- t.error(err)
66
- const parsed = JSON.parse(data)
67
- t.same(parsed, { something: 'else' })
68
- })
56
+ const result = await request(`http://localhost:${instance.server.address().port}`, {
57
+ method: 'PATCH',
58
+ headers: {
59
+ 'content-type': 'application/json'
60
+ },
61
+ body: bodyString
69
62
  })
63
+
64
+ t.assert.deepStrictEqual(await result.body.json(), { something: 'else' })
70
65
  })