@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.
- package/.github/workflows/ci.yml +6 -0
- package/CLAUDE.md +66 -0
- package/LICENSE +4 -1
- package/README.md +24 -0
- package/index.js +12 -1
- package/lib/request.js +16 -6
- package/lib/utils.js +1 -0
- package/package.json +6 -8
- package/test/async-route-handler.test.js +29 -32
- package/test/balanced-pool.test.js +48 -0
- package/test/base-get.test.js +27 -30
- package/test/base-path.test.js +27 -24
- package/test/base-querystring.test.js +27 -30
- package/test/build-url.test.js +17 -15
- package/test/core-with-path-in-base.test.js +30 -33
- package/test/custom-undici-instance.test.js +28 -36
- package/test/disable-request-logging.test.js +38 -52
- package/test/fastify-multipart-incompatibility.test.js +43 -49
- package/test/fix-GHSA-v2v2-hph8-q5xp.test.js +3 -2
- package/test/full-delete-http2.test.js +12 -11
- package/test/full-get-test.test.js +27 -30
- package/test/full-https-get.test.js +30 -30
- package/test/full-post-extended-content-type.test.js +40 -44
- package/test/full-post-http2.test.js +18 -13
- package/test/full-post-stream-core.test.js +39 -43
- package/test/full-post-stream.test.js +39 -43
- package/test/full-post.test.js +36 -38
- package/test/full-querystring-rewrite-option-complex.test.js +27 -31
- package/test/full-querystring-rewrite-option-function-request.test.js +30 -36
- package/test/full-querystring-rewrite-option-function.test.js +30 -33
- package/test/full-querystring-rewrite-option.test.js +28 -31
- package/test/full-querystring-rewrite-string.test.js +27 -30
- package/test/full-querystring-rewrite.test.js +27 -30
- package/test/full-querystring.test.js +27 -30
- package/test/full-rewrite-body-content-type.test.js +37 -41
- package/test/full-rewrite-body-http.test.js +39 -43
- package/test/full-rewrite-body-to-empty-string.test.js +37 -41
- package/test/full-rewrite-body-to-null.test.js +37 -41
- package/test/full-rewrite-body.test.js +39 -43
- package/test/get-upstream-cache.test.js +12 -11
- package/test/get-upstream-http.test.js +35 -41
- package/test/get-upstream-type.test.js +24 -27
- package/test/get-upstream-undici.test.js +23 -26
- package/test/host-header.test.js +22 -18
- package/test/http-agents.test.js +27 -30
- package/test/http-global-agent.test.js +20 -33
- package/test/http-http2.test.js +13 -18
- package/test/http-invalid-target.test.js +13 -17
- package/test/http-retry.test.js +22 -29
- package/test/http-timeout.test.js +87 -27
- package/test/http2-canceled-streams-cleanup.test.js +117 -0
- package/test/http2-http2.test.js +8 -8
- package/test/http2-https.test.js +29 -27
- package/test/http2-invalid-base.test.js +2 -2
- package/test/http2-invalid-target.test.js +13 -17
- package/test/http2-target-crash.test.js +16 -20
- package/test/http2-target-multi-crash.test.js +22 -27
- package/test/http2-timeout-disabled.test.js +20 -15
- package/test/http2-timeout.test.js +94 -43
- package/test/http2-unix-socket.test.js +2 -2
- package/test/https-agents.test.js +31 -30
- package/test/https-global-agent.test.js +22 -31
- package/test/method.test.js +37 -42
- package/test/modifyCoreObjects-false.test.js +27 -30
- package/test/no-body-opts-with-get.test.js +25 -31
- package/test/no-body-opts-with-head.test.js +28 -32
- package/test/no-stream-body-option.test.js +34 -36
- package/test/on-error.test.js +21 -23
- package/test/on-invalid-upstream-response.test.js +30 -37
- package/test/onResponse.test.js +25 -32
- package/test/padded-body.test.js +38 -43
- package/test/post-formbody.test.js +35 -40
- package/test/post-plain-text.test.js +35 -39
- package/test/post-with-custom-encoded-contenttype.test.js +37 -39
- package/test/post-with-octet-stream.test.js +18 -88
- package/test/retry-on-503.test.js +27 -26
- package/test/retry-with-a-custom-handler.test.js +33 -40
- package/test/rewrite-headers-type.test.js +24 -29
- package/test/rewrite-headers.test.js +31 -36
- package/test/rewrite-request-headers-type.test.js +25 -28
- package/test/rewrite-request-headers.test.js +26 -30
- package/test/transform-body.test.js +37 -43
- package/test/undici-agent.test.js +27 -31
- package/test/undici-body.test.js +37 -42
- package/test/undici-chaining.test.js +35 -42
- package/test/undici-connect-timeout.test.js +13 -13
- package/test/undici-custom-dispatcher.test.js +11 -11
- package/test/undici-global-agent.test.js +14 -33
- package/test/undici-no-destroy.test.js +2 -2
- package/test/undici-options.test.js +21 -24
- package/test/undici-proxy-agent.test.js +4 -3
- package/test/undici-retry.test.js +24 -31
- package/test/undici-timeout-body-partial.test.js +14 -16
- package/test/undici-timeout-body.test.js +17 -19
- package/test/undici-timeout.test.js +86 -23
- package/test/undici-with-path-in-base.test.js +28 -31
- package/test/undici.test.js +28 -31
- package/test/unexpected-error.test.js +13 -18
- package/test/unix-http-undici-from.test.js +22 -31
- package/test/unix-http-undici.test.js +32 -40
- package/test/unix-http.test.js +31 -39
- package/test/unix-https-undici.test.js +30 -35
- package/test/unix-https.test.js +35 -40
- package/types/index.d.ts +13 -5
- package/types/index.test-d.ts +6 -6
- package/test/get-with-body.test.js +0 -55
- package/test/head-with-body.test.js +0 -57
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { test } = require('
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
70
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
75
71
|
|
|
76
|
-
t.
|
|
77
|
-
t.
|
|
78
|
-
t.
|
|
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
|
-
|
|
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.
|
|
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
|
|
109
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
118
110
|
|
|
119
|
-
t.
|
|
120
|
-
t.
|
|
121
|
-
t.
|
|
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
|
|
126
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
135
127
|
|
|
136
|
-
t.
|
|
137
|
-
t.
|
|
138
|
-
t.
|
|
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
|
|
148
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
157
149
|
|
|
158
|
-
t.
|
|
159
|
-
t.
|
|
160
|
-
t.
|
|
161
|
-
t.
|
|
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
|
-
|
|
172
|
+
await request(`http://localhost:${instance.server.address().port}`)
|
|
173
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
181
174
|
|
|
182
|
-
t.
|
|
183
|
-
t.
|
|
184
|
-
t.
|
|
185
|
-
t.
|
|
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('
|
|
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.
|
|
13
|
-
t.
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
t.error(err)
|
|
33
|
+
t.after(() => target.close())
|
|
36
34
|
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
36
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
39
37
|
|
|
40
|
-
|
|
41
|
-
|
|
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('
|
|
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.
|
|
13
|
-
t.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
-
|
|
39
|
-
t.error(err)
|
|
37
|
+
t.after(() => target.close())
|
|
40
38
|
|
|
41
|
-
|
|
42
|
-
|
|
39
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
40
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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('
|
|
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.
|
|
13
|
-
t.
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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.
|
|
33
|
+
t.after(() => target.close())
|
|
33
34
|
|
|
34
|
-
instance.listen({ port: 0 },
|
|
35
|
-
t.error(err)
|
|
35
|
+
await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
|
|
36
36
|
|
|
37
|
-
target.listen({ port: 0 },
|
|
38
|
-
t.error(err)
|
|
37
|
+
await new Promise((resolve) => target.listen({ port: 0 }, resolve))
|
|
39
38
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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('
|
|
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.
|
|
13
|
-
t.
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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.
|
|
33
|
+
t.after(() => target.close())
|
|
33
34
|
|
|
34
|
-
instance.listen({ port: 0 },
|
|
35
|
-
|
|
35
|
+
await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
|
|
36
|
+
await new Promise((resolve) => target.listen({ port: 0 }, resolve))
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
t.error(err)
|
|
38
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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('
|
|
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.
|
|
14
|
-
t.
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
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
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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.
|
|
43
|
+
t.after(() => target.close())
|
|
43
44
|
|
|
44
|
-
instance.listen({ port: 0 },
|
|
45
|
-
t.error(err)
|
|
45
|
+
await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
|
|
46
46
|
|
|
47
|
-
target.listen({ port: 0 },
|
|
48
|
-
t.error(err)
|
|
47
|
+
await new Promise((resolve) => target.listen({ port: 0 }, resolve))
|
|
49
48
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
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('
|
|
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.
|
|
10
|
+
t.test('undici agent', async (t) => {
|
|
11
|
+
t.plan(6)
|
|
12
12
|
|
|
13
|
-
const instance = Fastify()
|
|
14
|
-
t.
|
|
13
|
+
const instance = Fastify()
|
|
14
|
+
t.after(() => instance.close())
|
|
15
15
|
|
|
16
|
-
const target = http.createServer((_req, res) => {
|
|
17
|
-
|
|
18
|
-
|
|
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
|
-
|
|
23
|
-
})
|
|
21
|
+
instance.get('/', (_request, reply) => {
|
|
22
|
+
reply.from()
|
|
23
|
+
})
|
|
24
24
|
|
|
25
|
-
t.
|
|
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 },
|
|
52
|
-
t.error(err)
|
|
51
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
53
52
|
|
|
54
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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 () {
|