@fastify/reply-from 12.0.2 → 12.2.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 (107) hide show
  1. package/.github/workflows/ci.yml +6 -0
  2. package/CLAUDE.md +66 -0
  3. package/LICENSE +4 -1
  4. package/README.md +24 -0
  5. package/index.js +12 -1
  6. package/lib/request.js +16 -6
  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 +87 -27
  51. package/test/http2-canceled-streams-cleanup.test.js +117 -0
  52. package/test/http2-http2.test.js +8 -8
  53. package/test/http2-https.test.js +29 -27
  54. package/test/http2-invalid-base.test.js +2 -2
  55. package/test/http2-invalid-target.test.js +13 -17
  56. package/test/http2-target-crash.test.js +16 -20
  57. package/test/http2-target-multi-crash.test.js +22 -27
  58. package/test/http2-timeout-disabled.test.js +20 -15
  59. package/test/http2-timeout.test.js +94 -43
  60. package/test/http2-unix-socket.test.js +2 -2
  61. package/test/https-agents.test.js +31 -30
  62. package/test/https-global-agent.test.js +22 -31
  63. package/test/method.test.js +37 -42
  64. package/test/modifyCoreObjects-false.test.js +27 -30
  65. package/test/no-body-opts-with-get.test.js +25 -31
  66. package/test/no-body-opts-with-head.test.js +28 -32
  67. package/test/no-stream-body-option.test.js +34 -36
  68. package/test/on-error.test.js +21 -23
  69. package/test/on-invalid-upstream-response.test.js +30 -37
  70. package/test/onResponse.test.js +25 -32
  71. package/test/padded-body.test.js +38 -43
  72. package/test/post-formbody.test.js +35 -40
  73. package/test/post-plain-text.test.js +35 -39
  74. package/test/post-with-custom-encoded-contenttype.test.js +37 -39
  75. package/test/post-with-octet-stream.test.js +18 -88
  76. package/test/retry-on-503.test.js +27 -26
  77. package/test/retry-with-a-custom-handler.test.js +33 -40
  78. package/test/rewrite-headers-type.test.js +24 -29
  79. package/test/rewrite-headers.test.js +31 -36
  80. package/test/rewrite-request-headers-type.test.js +25 -28
  81. package/test/rewrite-request-headers.test.js +26 -30
  82. package/test/transform-body.test.js +37 -43
  83. package/test/undici-agent.test.js +27 -31
  84. package/test/undici-body.test.js +37 -42
  85. package/test/undici-chaining.test.js +35 -42
  86. package/test/undici-connect-timeout.test.js +13 -13
  87. package/test/undici-custom-dispatcher.test.js +11 -11
  88. package/test/undici-global-agent.test.js +14 -33
  89. package/test/undici-no-destroy.test.js +2 -2
  90. package/test/undici-options.test.js +21 -24
  91. package/test/undici-proxy-agent.test.js +4 -3
  92. package/test/undici-retry.test.js +24 -31
  93. package/test/undici-timeout-body-partial.test.js +14 -16
  94. package/test/undici-timeout-body.test.js +17 -19
  95. package/test/undici-timeout.test.js +86 -23
  96. package/test/undici-with-path-in-base.test.js +28 -31
  97. package/test/undici.test.js +28 -31
  98. package/test/unexpected-error.test.js +13 -18
  99. package/test/unix-http-undici-from.test.js +22 -31
  100. package/test/unix-http-undici.test.js +32 -40
  101. package/test/unix-http.test.js +31 -39
  102. package/test/unix-https-undici.test.js +30 -35
  103. package/test/unix-https.test.js +35 -40
  104. package/types/index.d.ts +13 -5
  105. package/types/index.test-d.ts +6 -6
  106. package/test/get-with-body.test.js +0 -55
  107. package/test/head-with-body.test.js +0 -57
@@ -1,10 +1,10 @@
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
7
  const http = require('node:http')
7
- const got = require('got')
8
8
 
9
9
  function serverWithCustomError (stopAfter, statusCodeToFailOn, closeSocket) {
10
10
  let requestCount = 0
@@ -26,7 +26,7 @@ async function setupServer (t, fromOptions = {}, statusCodeToFailOn = 500, stopA
26
26
  const target = serverWithCustomError(stopAfter, statusCodeToFailOn, closeSocket)
27
27
 
28
28
  await target.listen({ port: 0 })
29
- t.teardown(target.close.bind(target))
29
+ t.after(() => target.close())
30
30
 
31
31
  const instance = Fastify()
32
32
  instance.register(From, {
@@ -37,7 +37,7 @@ async function setupServer (t, fromOptions = {}, statusCodeToFailOn = 500, stopA
37
37
  reply.from(`http://localhost:${target.address().port}`, fromOptions)
38
38
  })
39
39
 
40
- t.teardown(instance.close.bind(instance))
40
+ t.after(() => instance.close())
41
41
  await instance.listen({ port: 0 })
42
42
 
43
43
  return {
@@ -48,14 +48,10 @@ async function setupServer (t, fromOptions = {}, statusCodeToFailOn = 500, stopA
48
48
  test('a 500 status code with no custom handler should fail', async (t) => {
49
49
  const { instance } = await setupServer(t)
50
50
 
51
- let errorMessage
52
- try {
53
- await got.get(`http://localhost:${instance.server.address().port}`, { retry: 3 })
54
- } catch (error) {
55
- errorMessage = error.message
56
- }
51
+ const result = await request(`http://localhost:${instance.server.address().port}`, { dispatcher: new Agent({ pipelining: 3 }) })
57
52
 
58
- t.equal(errorMessage, 'Response code 500 (Internal Server Error)')
53
+ t.assert.strictEqual(result.statusCode, 500)
54
+ t.assert.strictEqual(await result.body.text(), 'This Service is Unavailable')
59
55
  })
60
56
 
61
57
  test("a server 500's with a custom handler and should revive", async (t) => {
@@ -71,11 +67,11 @@ test("a server 500's with a custom handler and should revive", async (t) => {
71
67
 
72
68
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic })
73
69
 
74
- const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
70
+ const res = await request(`http://localhost:${instance.server.address().port}`)
75
71
 
76
- t.equal(res.headers['content-type'], 'text/plain')
77
- t.equal(res.statusCode, 205)
78
- t.equal(res.body.toString(), 'Hello World 5!')
72
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
73
+ t.assert.strictEqual(res.statusCode, 205)
74
+ t.assert.strictEqual(await res.body.text(), 'Hello World 5!')
79
75
  })
80
76
 
81
77
  test('custom retry does not invoke the default delay causing a 501', async (t) => {
@@ -89,14 +85,10 @@ test('custom retry does not invoke the default delay causing a 501', async (t) =
89
85
 
90
86
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 501)
91
87
 
92
- let errorMessage
93
- try {
94
- await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
95
- } catch (error) {
96
- errorMessage = error.message
97
- }
88
+ const res = await request(`http://localhost:${instance.server.address().port}`)
98
89
 
99
- t.equal(errorMessage, 'Response code 501 (Not Implemented)')
90
+ t.assert.strictEqual(res.statusCode, 501)
91
+ t.assert.strictEqual(await res.body.text(), 'This Service is Unavailable')
100
92
  })
101
93
 
102
94
  test('custom retry delay functions can invoke the default delay', async (t) => {
@@ -114,11 +106,11 @@ test('custom retry delay functions can invoke the default delay', async (t) => {
114
106
 
115
107
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500)
116
108
 
117
- const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
109
+ const res = await request(`http://localhost:${instance.server.address().port}`)
118
110
 
119
- t.equal(res.headers['content-type'], 'text/plain')
120
- t.equal(res.statusCode, 205)
121
- t.equal(res.body.toString(), 'Hello World 5!')
111
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
112
+ t.assert.strictEqual(res.statusCode, 205)
113
+ t.assert.strictEqual(await res.body.text(), 'Hello World 5!')
122
114
  })
123
115
 
124
116
  test('custom retry delay function inspects the err paramater', async (t) => {
@@ -131,11 +123,11 @@ test('custom retry delay function inspects the err paramater', async (t) => {
131
123
 
132
124
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500, 4, true)
133
125
 
134
- const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
126
+ const res = await request(`http://localhost:${instance.server.address().port}`)
135
127
 
136
- t.equal(res.headers['content-type'], 'text/plain')
137
- t.equal(res.statusCode, 205)
138
- t.equal(res.body.toString(), 'Hello World 5!')
128
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
129
+ t.assert.strictEqual(res.statusCode, 205)
130
+ t.assert.strictEqual(await res.body.text(), 'Hello World 5!')
139
131
  })
140
132
 
141
133
  test('we can exceed our retryCount and introspect attempts independently', async (t) => {
@@ -153,12 +145,12 @@ test('we can exceed our retryCount and introspect attempts independently', async
153
145
 
154
146
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500, 4, true)
155
147
 
156
- const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
148
+ const res = await request(`http://localhost:${instance.server.address().port}`)
157
149
 
158
- t.match(attemptCounter, [0, 1, 2, 3, 4])
159
- t.equal(res.headers['content-type'], 'text/plain')
160
- t.equal(res.statusCode, 205)
161
- t.equal(res.body.toString(), 'Hello World 5!')
150
+ t.assert.deepStrictEqual(attemptCounter, [0, 1, 2, 3, 4])
151
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
152
+ t.assert.strictEqual(res.statusCode, 205)
153
+ t.assert.strictEqual(await res.body.text(), 'Hello World 5!')
162
154
  })
163
155
 
164
156
  test('we handle our retries based on the retryCount', async (t) => {
@@ -177,10 +169,11 @@ test('we handle our retries based on the retryCount', async (t) => {
177
169
 
178
170
  const { instance } = await setupServer(t, { retryDelay: customRetryLogic, retriesCount: 2 }, 500)
179
171
 
180
- const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
172
+ await request(`http://localhost:${instance.server.address().port}`)
173
+ const res = await request(`http://localhost:${instance.server.address().port}`)
181
174
 
182
- t.match(attemptCounter, [0, 1])
183
- t.equal(res.headers['content-type'], 'text/plain')
184
- t.equal(res.statusCode, 205)
185
- t.equal(res.body.toString(), 'Hello World 5!')
175
+ t.assert.deepStrictEqual(attemptCounter.slice(0, 2), [0, 1])
176
+ t.assert.strictEqual(res.headers['content-type'], 'text/plain')
177
+ t.assert.strictEqual(res.statusCode, 205)
178
+ t.assert.strictEqual(await res.body.text(), 'Hello World 5!')
186
179
  })
@@ -1,45 +1,40 @@
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
  instance.register(From)
11
11
 
12
- t.plan(8)
13
- t.teardown(instance.close.bind(instance))
12
+ t.test('rewriteHeaders type', async (t) => {
13
+ t.plan(5)
14
+ t.after(() => instance.close())
14
15
 
15
- const target = http.createServer((req, res) => {
16
- t.pass('request proxied')
17
- t.equal(req.method, 'GET')
18
- res.statusCode = 205
19
- res.end('hello world')
20
- })
21
-
22
- instance.get('/', (request, reply) => {
23
- reply.from(`http://localhost:${target.address().port}`, {
24
- rewriteHeaders: (_headers, req) => {
25
- t.pass('rewriteHeaders called with correct request parameter')
26
- t.equal(req, request)
27
- return {}
28
- }
16
+ const target = http.createServer((req, res) => {
17
+ t.assert.ok('request proxied')
18
+ t.assert.strictEqual(req.method, 'GET')
19
+ res.statusCode = 205
20
+ res.end('hello world')
29
21
  })
30
- })
31
22
 
32
- t.teardown(target.close.bind(target))
23
+ instance.get('/', (request, reply) => {
24
+ reply.from(`http://localhost:${target.address().port}`, {
25
+ rewriteHeaders: (_headers, req) => {
26
+ t.assert.ok('rewriteHeaders called with correct request parameter')
27
+ t.assert.strictEqual(req, request)
28
+ return {}
29
+ }
30
+ })
31
+ })
33
32
 
34
- instance.listen({ port: 0 }, (err) => {
35
- t.error(err)
33
+ t.after(() => target.close())
36
34
 
37
- target.listen({ port: 0 }, (err) => {
38
- t.error(err)
35
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
36
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
39
37
 
40
- get(`http://localhost:${instance.server.address().port}`, (err, res) => {
41
- t.error(err)
42
- t.equal(res.statusCode, 205)
43
- })
44
- })
38
+ const result = await request(`http://localhost:${instance.server.address().port}`)
39
+ t.assert.strictEqual(result.statusCode, 205)
45
40
  })
@@ -1,52 +1,47 @@
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
  instance.register(From)
11
11
 
12
- t.plan(10)
13
- t.teardown(instance.close.bind(instance))
14
-
15
- const target = http.createServer((req, res) => {
16
- t.pass('request proxied')
17
- t.equal(req.method, 'GET')
18
- res.statusCode = 205
19
- res.setHeader('Content-Type', 'text/plain')
20
- res.setHeader('x-my-header', 'hello!')
21
- res.end('hello world')
22
- })
12
+ t.test('rewriteHeaders', async (t) => {
13
+ t.plan(7)
14
+ t.after(() => instance.close())
15
+
16
+ const target = http.createServer((req, res) => {
17
+ t.assert.ok('request proxied')
18
+ t.assert.strictEqual(req.method, 'GET')
19
+ res.statusCode = 205
20
+ res.setHeader('Content-Type', 'text/plain')
21
+ res.setHeader('x-my-header', 'hello!')
22
+ res.end('hello world')
23
+ })
23
24
 
24
- instance.get('/', (_request, reply) => {
25
- reply.from(`http://localhost:${target.address().port}`, {
26
- rewriteHeaders: (headers) => {
27
- t.pass('rewriteHeaders called')
28
- return {
29
- 'content-type': headers['content-type'],
30
- 'x-another-header': 'so headers!'
25
+ instance.get('/', (_request, reply) => {
26
+ reply.from(`http://localhost:${target.address().port}`, {
27
+ rewriteHeaders: (headers) => {
28
+ t.assert.ok('rewriteHeaders called')
29
+ return {
30
+ 'content-type': headers['content-type'],
31
+ 'x-another-header': 'so headers!'
32
+ }
31
33
  }
32
- }
34
+ })
33
35
  })
34
- })
35
-
36
- t.teardown(target.close.bind(target))
37
36
 
38
- instance.listen({ port: 0 }, (err) => {
39
- t.error(err)
37
+ t.after(() => target.close())
40
38
 
41
- target.listen({ port: 0 }, (err) => {
42
- t.error(err)
39
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
40
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
43
41
 
44
- get(`http://localhost:${instance.server.address().port}`, (err, res) => {
45
- t.error(err)
46
- t.equal(res.headers['content-type'], 'text/plain')
47
- t.equal(res.headers['x-another-header'], 'so headers!')
48
- t.notOk(res.headers['x-my-header'])
49
- t.equal(res.statusCode, 205)
50
- })
51
- })
42
+ const result = await request(`http://localhost:${instance.server.address().port}`)
43
+ t.assert.strictEqual(result.headers['content-type'], 'text/plain')
44
+ t.assert.strictEqual(result.headers['x-another-header'], 'so headers!')
45
+ t.assert.ok(!result.headers['x-my-header'])
46
+ t.assert.strictEqual(result.statusCode, 205)
52
47
  })
@@ -1,45 +1,42 @@
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
  instance.register(From)
11
11
 
12
- t.plan(8)
13
- t.teardown(instance.close.bind(instance))
12
+ t.test('rewriteRequestHeaders type', async (t) => {
13
+ t.plan(5)
14
+ t.after(() => instance.close())
14
15
 
15
- const target = http.createServer((req, res) => {
16
- t.pass('request proxied')
17
- t.equal(req.method, 'GET')
18
- res.statusCode = 205
19
- res.end(req.headers.host)
20
- })
16
+ const target = http.createServer((req, res) => {
17
+ t.assert.ok('request proxied')
18
+ t.assert.strictEqual(req.method, 'GET')
19
+ res.statusCode = 205
20
+ res.end(req.headers.host)
21
+ })
21
22
 
22
- instance.get('/', (request, reply) => {
23
- reply.from(`http://localhost:${target.address().port}`, {
24
- rewriteRequestHeaders: (originalReq) => {
25
- t.pass('rewriteRequestHeaders called with correct request parameter')
26
- t.equal(originalReq, request)
27
- return {}
28
- }
23
+ instance.get('/', (request, reply) => {
24
+ reply.from(`http://localhost:${target.address().port}`, {
25
+ rewriteRequestHeaders: (originalReq) => {
26
+ t.assert.ok('rewriteRequestHeaders called with correct request parameter')
27
+ t.assert.strictEqual(originalReq, request)
28
+ return {}
29
+ }
30
+ })
29
31
  })
30
- })
31
32
 
32
- t.teardown(target.close.bind(target))
33
+ t.after(() => target.close())
33
34
 
34
- instance.listen({ port: 0 }, (err) => {
35
- t.error(err)
35
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
36
36
 
37
- target.listen({ port: 0 }, (err) => {
38
- t.error(err)
37
+ await new Promise((resolve) => target.listen({ port: 0 }, resolve))
39
38
 
40
- get(`http://localhost:${instance.server.address().port}`, (err, res) => {
41
- t.error(err)
42
- t.equal(res.statusCode, 205)
43
- })
44
- })
39
+ const result = await request(`http://localhost:${instance.server.address().port}`)
40
+
41
+ t.assert.strictEqual(result.statusCode, 205)
45
42
  })
@@ -1,47 +1,43 @@
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
  instance.register(From)
11
11
 
12
- t.plan(9)
13
- t.teardown(instance.close.bind(instance))
12
+ t.test('rewriteRequestHeaders', async (t) => {
13
+ t.plan(6)
14
+ t.after(() => instance.close())
14
15
 
15
- const target = http.createServer((req, res) => {
16
- t.pass('request proxied')
17
- t.equal(req.method, 'GET')
18
- res.statusCode = 205
19
- res.setHeader('Content-Type', 'text/plain')
20
- res.end(req.headers.host)
21
- })
16
+ const target = http.createServer((req, res) => {
17
+ t.assert.ok('request proxied')
18
+ t.assert.strictEqual(req.method, 'GET')
19
+ res.statusCode = 205
20
+ res.setHeader('Content-Type', 'text/plain')
21
+ res.end(req.headers.host)
22
+ })
22
23
 
23
- instance.get('/', (_request, reply) => {
24
- reply.from(`http://localhost:${target.address().port}`, {
25
- rewriteRequestHeaders: (_originalReq, headers) => {
26
- t.pass('rewriteRequestHeaders called')
27
- return Object.assign(headers, { host: 'host-override' })
28
- }
24
+ instance.get('/', (_request, reply) => {
25
+ reply.from(`http://localhost:${target.address().port}`, {
26
+ rewriteRequestHeaders: (_originalReq, headers) => {
27
+ t.assert.ok('rewriteRequestHeaders called')
28
+ return Object.assign(headers, { host: 'host-override' })
29
+ }
30
+ })
29
31
  })
30
- })
31
32
 
32
- t.teardown(target.close.bind(target))
33
+ t.after(() => target.close())
33
34
 
34
- instance.listen({ port: 0 }, (err) => {
35
- t.error(err)
35
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
36
+ await new Promise((resolve) => target.listen({ port: 0 }, resolve))
36
37
 
37
- target.listen({ port: 0 }, (err) => {
38
- t.error(err)
38
+ const result = await request(`http://localhost:${instance.server.address().port}`)
39
39
 
40
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
41
- t.error(err)
42
- t.equal(res.headers['content-type'], 'text/plain')
43
- t.equal(res.statusCode, 205)
44
- t.equal(data.toString(), 'host-override')
45
- })
46
- })
40
+ t.assert.strictEqual(result.headers['content-type'], 'text/plain')
41
+ t.assert.strictEqual(result.statusCode, 205)
42
+ t.assert.strictEqual(await result.body.text(), 'host-override')
47
43
  })
@@ -1,61 +1,55 @@
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
  const Transform = require('node:stream').Transform
9
9
 
10
10
  const instance = Fastify()
11
11
  instance.register(From)
12
12
 
13
- t.plan(9)
14
- t.teardown(instance.close.bind(instance))
15
-
16
- const target = http.createServer((req, res) => {
17
- t.pass('request proxied')
18
- t.equal(req.method, 'GET')
19
- res.statusCode = 205
20
- res.setHeader('Content-Type', 'text/plain')
21
- res.setHeader('x-my-header', 'hello!')
22
- res.end('hello world')
23
- })
13
+ t.test('transform body', async (t) => {
14
+ t.plan(6)
15
+ t.after(() => instance.close())
16
+
17
+ const target = http.createServer((req, res) => {
18
+ t.assert.ok('request proxied')
19
+ t.assert.strictEqual(req.method, 'GET')
20
+ res.statusCode = 205
21
+ res.setHeader('Content-Type', 'text/plain')
22
+ res.setHeader('x-my-header', 'hello!')
23
+ res.end('hello world')
24
+ })
24
25
 
25
- instance.get('/', (_request, reply) => {
26
- reply.from(`http://localhost:${target.address().port}`, {
27
- onResponse: (_request, reply, res) => {
28
- reply.send(
29
- res.stream.pipe(
30
- new Transform({
31
- transform: function (chunk, _enc, cb) {
32
- this.push(chunk.toString().toUpperCase())
33
- cb()
34
- }
35
- })
26
+ instance.get('/', (_request, reply) => {
27
+ reply.from(`http://localhost:${target.address().port}`, {
28
+ onResponse: (_request, reply, res) => {
29
+ reply.send(
30
+ res.stream.pipe(
31
+ new Transform({
32
+ transform: function (chunk, _enc, cb) {
33
+ this.push(chunk.toString().toUpperCase())
34
+ cb()
35
+ }
36
+ })
37
+ )
36
38
  )
37
- )
38
- }
39
+ }
40
+ })
39
41
  })
40
- })
41
42
 
42
- t.teardown(target.close.bind(target))
43
+ t.after(() => target.close())
43
44
 
44
- instance.listen({ port: 0 }, err => {
45
- t.error(err)
45
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
46
46
 
47
- target.listen({ port: 0 }, err => {
48
- t.error(err)
47
+ await new Promise((resolve) => target.listen({ port: 0 }, resolve))
49
48
 
50
- get(
51
- `http://localhost:${instance.server.address().port}`,
52
- (err, res, data) => {
53
- t.error(err)
54
- t.equal(res.headers['content-type'], 'text/plain')
55
- t.equal(res.headers['x-my-header'], 'hello!')
56
- t.equal(res.statusCode, 205)
57
- t.equal(data.toString(), 'HELLO WORLD')
58
- }
59
- )
60
- })
49
+ const result = await request(`http://localhost:${instance.server.address().port}`)
50
+
51
+ t.assert.strictEqual(result.headers['content-type'], 'text/plain')
52
+ t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
53
+ t.assert.strictEqual(result.statusCode, 205)
54
+ t.assert.strictEqual(await result.body.text(), 'HELLO WORLD')
61
55
  })
@@ -1,31 +1,31 @@
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 undici = require('undici')
5
6
  const proxyquire = require('proxyquire')
6
7
  const http = require('node:http')
7
- const get = require('simple-get').concat
8
- const undici = require('undici')
9
8
  const { getUndiciOptions } = require('../lib/request')
10
9
 
11
- t.plan(10)
10
+ t.test('undici agent', async (t) => {
11
+ t.plan(6)
12
12
 
13
- const instance = Fastify()
14
- t.teardown(instance.close.bind(instance))
13
+ const instance = Fastify()
14
+ t.after(() => instance.close())
15
15
 
16
- const target = http.createServer((_req, res) => {
17
- res.statusCode = 200
18
- res.end('hello world')
19
- })
16
+ const target = http.createServer((_req, res) => {
17
+ res.statusCode = 200
18
+ res.end('hello world')
19
+ })
20
20
 
21
- instance.get('/', (_request, reply) => {
22
- reply.from()
23
- })
21
+ instance.get('/', (_request, reply) => {
22
+ reply.from()
23
+ })
24
24
 
25
- t.teardown(target.close.bind(target))
25
+ t.after(() => target.close())
26
+
27
+ await new Promise(resolve => target.listen({ port: 0 }, resolve))
26
28
 
27
- target.listen({ port: 0 }, err => {
28
- t.error(err)
29
29
  let poolCreation = 0
30
30
 
31
31
  const From = proxyquire('..', {
@@ -48,23 +48,19 @@ target.listen({ port: 0 }, err => {
48
48
  undici: buildUndiciOptions()
49
49
  })
50
50
 
51
- instance.listen({ port: 0 }, err => {
52
- t.error(err)
51
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
53
52
 
54
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
55
- t.error(err)
56
- t.equal(res.statusCode, 200)
57
- t.equal(data.toString(), 'hello world')
58
- t.equal(poolCreation, 1)
53
+ const result = await undici.request(`http://localhost:${instance.server.address().port}`)
59
54
 
60
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
61
- t.error(err)
62
- t.equal(res.statusCode, 200)
63
- t.equal(data.toString(), 'hello world')
64
- t.equal(poolCreation, 1)
65
- })
66
- })
67
- })
55
+ t.assert.strictEqual(result.statusCode, 200)
56
+ t.assert.strictEqual(await result.body.text(), 'hello world')
57
+ t.assert.strictEqual(poolCreation, 1)
58
+
59
+ const result2 = await undici.request(`http://localhost:${instance.server.address().port}`)
60
+
61
+ t.assert.strictEqual(result2.statusCode, 200)
62
+ t.assert.strictEqual(await result2.body.text(), 'hello world')
63
+ t.assert.strictEqual(poolCreation, 1)
68
64
  })
69
65
 
70
66
  function buildUndiciOptions () {