@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,22 +1,22 @@
|
|
|
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
|
-
const got = require('got')
|
|
7
7
|
|
|
8
8
|
test('http2 request timeout disabled', async (t) => {
|
|
9
9
|
const target = Fastify({ http2: true })
|
|
10
|
-
t.
|
|
10
|
+
t.after(() => target.close())
|
|
11
11
|
|
|
12
12
|
target.get('/', () => {
|
|
13
|
-
t.
|
|
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.
|
|
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
|
-
|
|
34
|
-
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
89
|
+
t.assert.strictEqual(result, 'passed')
|
|
85
90
|
})
|
|
@@ -1,22 +1,23 @@
|
|
|
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
|
-
const
|
|
7
|
+
const FakeTimers = require('@sinonjs/fake-timers')
|
|
7
8
|
|
|
8
9
|
test('http2 request timeout', async (t) => {
|
|
9
10
|
const target = Fastify({ http2: true, sessionTimeout: 0 })
|
|
10
|
-
t.
|
|
11
|
+
t.after(() => target.close())
|
|
11
12
|
|
|
12
13
|
target.get('/', () => {
|
|
13
|
-
t.
|
|
14
|
+
t.assert.ok('request arrives')
|
|
14
15
|
})
|
|
15
16
|
|
|
16
17
|
await target.listen({ port: 0 })
|
|
17
18
|
|
|
18
19
|
const instance = Fastify()
|
|
19
|
-
t.
|
|
20
|
+
t.after(() => instance.close())
|
|
20
21
|
|
|
21
22
|
instance.register(From, {
|
|
22
23
|
base: `http://localhost:${target.server.address().port}`,
|
|
@@ -29,38 +30,92 @@ test('http2 request timeout', async (t) => {
|
|
|
29
30
|
|
|
30
31
|
await instance.listen({ port: 0 })
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, {
|
|
34
|
+
dispatcher: new Agent({
|
|
35
|
+
pipelining: 0
|
|
35
36
|
})
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
})
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
test('http2 request with specific timeout', async (t) => {
|
|
49
|
+
const clock = FakeTimers.createClock()
|
|
50
|
+
const target = Fastify({ http2: true })
|
|
51
|
+
t.after(() => target.close())
|
|
52
|
+
|
|
53
|
+
target.get('/', (_request, reply) => {
|
|
54
|
+
t.assert.ok('request arrives')
|
|
55
|
+
|
|
56
|
+
setTimeout(() => {
|
|
57
|
+
reply.status(200).send('hello world')
|
|
58
|
+
}, 200)
|
|
59
|
+
|
|
60
|
+
clock.tick(200)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
await target.listen({ port: 0 })
|
|
64
|
+
|
|
65
|
+
const instance = Fastify()
|
|
66
|
+
t.after(() => instance.close())
|
|
67
|
+
|
|
68
|
+
instance.register(From, {
|
|
69
|
+
base: `http://localhost:${target.server.address().port}`,
|
|
70
|
+
http2: { requestTimeout: 100, sessionTimeout: 6000 }
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
instance.get('/success', (_request, reply) => {
|
|
74
|
+
reply.from(`http://localhost:${target.server.address().port}/`, {
|
|
75
|
+
timeout: 300
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
instance.get('/fail', (_request, reply) => {
|
|
79
|
+
reply.from(`http://localhost:${target.server.address().port}/`, {
|
|
80
|
+
timeout: 50
|
|
44
81
|
})
|
|
82
|
+
})
|
|
45
83
|
|
|
46
|
-
|
|
47
|
-
}
|
|
84
|
+
await instance.listen({ port: 0 })
|
|
85
|
+
const result = await request(`http://localhost:${instance.server.address().port}/success`, {
|
|
86
|
+
dispatcher: new Agent({
|
|
87
|
+
pipelining: 0
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
48
91
|
|
|
49
|
-
|
|
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
|
+
})
|
|
50
105
|
})
|
|
51
106
|
|
|
52
107
|
test('http2 session timeout', async (t) => {
|
|
53
108
|
const target = Fastify({ http2: true, sessionTimeout: 0 })
|
|
54
|
-
t.
|
|
109
|
+
t.after(() => target.close())
|
|
55
110
|
|
|
56
111
|
target.get('/', () => {
|
|
57
|
-
t.
|
|
112
|
+
t.assert.ok('request arrives')
|
|
58
113
|
})
|
|
59
114
|
|
|
60
115
|
await target.listen({ port: 0 })
|
|
61
116
|
|
|
62
117
|
const instance = Fastify()
|
|
63
|
-
t.
|
|
118
|
+
t.after(() => instance.close())
|
|
64
119
|
|
|
65
120
|
instance.register(From, {
|
|
66
121
|
base: `http://localhost:${target.server.address().port}`,
|
|
@@ -73,31 +128,27 @@ test('http2 session timeout', async (t) => {
|
|
|
73
128
|
|
|
74
129
|
await instance.listen({ port: 0 })
|
|
75
130
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
131
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, {
|
|
132
|
+
dispatcher: new Agent({
|
|
133
|
+
pipelining: 0
|
|
79
134
|
})
|
|
80
|
-
}
|
|
81
|
-
t.equal(err.response.statusCode, 504)
|
|
82
|
-
t.match(err.response.headers['content-type'], /application\/json/)
|
|
83
|
-
t.same(JSON.parse(err.response.body), {
|
|
84
|
-
statusCode: 504,
|
|
85
|
-
code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
|
|
86
|
-
error: 'Gateway Timeout',
|
|
87
|
-
message: 'Gateway Timeout'
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
return
|
|
91
|
-
}
|
|
135
|
+
})
|
|
92
136
|
|
|
93
|
-
t.
|
|
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
|
+
})
|
|
94
145
|
})
|
|
95
146
|
|
|
96
147
|
test('http2 sse removes request and session timeout test', async (t) => {
|
|
97
148
|
const target = Fastify({ http2: true, sessionTimeout: 0 })
|
|
98
149
|
|
|
99
150
|
target.get('/', (_request, reply) => {
|
|
100
|
-
t.
|
|
151
|
+
t.assert.ok('request arrives')
|
|
101
152
|
|
|
102
153
|
reply.status(200).header('content-type', 'text/event-stream').send('hello world')
|
|
103
154
|
})
|
|
@@ -117,11 +168,11 @@ test('http2 sse removes request and session timeout test', async (t) => {
|
|
|
117
168
|
|
|
118
169
|
await instance.listen({ port: 0 })
|
|
119
170
|
|
|
120
|
-
t.
|
|
121
|
-
t.
|
|
171
|
+
t.after(() => instance.close())
|
|
172
|
+
t.after(() => target.close())
|
|
122
173
|
|
|
123
|
-
const { statusCode } = await
|
|
124
|
-
t.
|
|
174
|
+
const { statusCode } = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
|
|
175
|
+
t.assert.strictEqual(statusCode, 200)
|
|
125
176
|
instance.close()
|
|
126
177
|
target.close()
|
|
127
178
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { test } = require('
|
|
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('
|
|
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
|
|
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.
|
|
22
|
-
t.
|
|
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
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
36
|
-
})
|
|
36
|
+
instance.get('/', (_request, reply) => {
|
|
37
|
+
reply.from()
|
|
38
|
+
})
|
|
37
39
|
|
|
38
|
-
t.
|
|
40
|
+
t.after(() => target.close())
|
|
39
41
|
|
|
40
|
-
target.listen({ port: 0 },
|
|
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 },
|
|
54
|
-
t.error(err)
|
|
54
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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('
|
|
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
|
|
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.
|
|
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.
|
|
30
|
-
t.
|
|
31
|
-
t.
|
|
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.
|
|
36
|
+
t.after(() => target.close())
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
target.listen({ port: 0 }, (err) => {
|
|
39
|
-
t.error(err)
|
|
38
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
instance.register(From, {
|
|
41
|
+
base: `https://localhost:${target.address().port}`,
|
|
42
|
+
globalAgent: true,
|
|
43
|
+
http: {
|
|
44
|
+
}
|
|
45
|
+
})
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
t.error(err)
|
|
47
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
50
48
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
57
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
67
58
|
|
|
68
59
|
target.close()
|
|
69
60
|
})
|
package/test/method.test.js
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
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
|
|
|
11
|
-
t.
|
|
12
|
-
t.
|
|
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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
|
|
38
|
-
})
|
|
37
|
+
instance.patch('/', (_request, reply) => {
|
|
38
|
+
reply.from(`http://localhost:${target.address().port}`, { method: 'POST' })
|
|
39
|
+
})
|
|
39
40
|
|
|
40
|
-
t.
|
|
41
|
+
t.after(() => target.close())
|
|
41
42
|
|
|
42
|
-
target.listen({ port: 0 },
|
|
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 },
|
|
55
|
-
t.error(err)
|
|
54
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
})
|
|
@@ -1,48 +1,45 @@
|
|
|
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({ modifyCoreObjects: false })
|
|
10
10
|
|
|
11
|
-
t.
|
|
12
|
-
t.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
t.test('modifyCoreObjects false', async (t) => {
|
|
12
|
+
t.plan(7)
|
|
13
|
+
t.after(() => instance.close())
|
|
14
|
+
|
|
15
|
+
const target = http.createServer((req, res) => {
|
|
16
|
+
t.assert.ok('request proxied')
|
|
17
|
+
t.assert.strictEqual(req.method, 'GET')
|
|
18
|
+
t.assert.strictEqual(req.url, '/')
|
|
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
|
-
})
|
|
25
|
+
instance.get('/', (_request, reply) => {
|
|
26
|
+
reply.from()
|
|
27
|
+
})
|
|
27
28
|
|
|
28
|
-
t.
|
|
29
|
+
t.after(() => target.close())
|
|
29
30
|
|
|
30
|
-
target.listen({ port: 0 },
|
|
31
|
-
t.error(err)
|
|
31
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
32
32
|
|
|
33
33
|
instance.register(From, {
|
|
34
34
|
base: `http://localhost:${target.address().port}`
|
|
35
35
|
})
|
|
36
36
|
|
|
37
|
-
instance.listen({ port: 0 },
|
|
38
|
-
t.error(err)
|
|
37
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
39
38
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
})
|
|
47
|
-
})
|
|
39
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
40
|
+
|
|
41
|
+
t.assert.strictEqual(result.headers['content-type'], 'text/plain')
|
|
42
|
+
t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
|
|
43
|
+
t.assert.strictEqual(result.statusCode, 205)
|
|
44
|
+
t.assert.strictEqual(await result.body.text(), 'hello world')
|
|
48
45
|
})
|