@fastify/reply-from 12.1.0 → 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 +3 -0
- package/CLAUDE.md +66 -0
- package/LICENSE +4 -1
- package/README.md +20 -0
- package/index.js +10 -0
- package/lib/request.js +11 -2
- 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 +49 -42
- 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 +58 -65
- 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 +41 -37
- 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 +9 -2
- package/types/index.test-d.ts +3 -4
- 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,23 +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 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.
|
|
11
|
+
t.after(() => target.close())
|
|
12
12
|
|
|
13
13
|
target.get('/', () => {
|
|
14
|
-
t.
|
|
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.
|
|
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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, {
|
|
34
|
+
dispatcher: new Agent({
|
|
35
|
+
pipelining: 0
|
|
36
36
|
})
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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.
|
|
51
|
+
t.after(() => target.close())
|
|
57
52
|
|
|
58
53
|
target.get('/', (_request, reply) => {
|
|
59
|
-
t.
|
|
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.
|
|
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
|
|
91
|
-
|
|
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
|
-
|
|
105
|
-
|
|
89
|
+
})
|
|
90
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
106
91
|
|
|
107
|
-
|
|
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.
|
|
109
|
+
t.after(() => target.close())
|
|
113
110
|
|
|
114
111
|
target.get('/', () => {
|
|
115
|
-
t.
|
|
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.
|
|
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
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
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.
|
|
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.
|
|
179
|
-
t.
|
|
171
|
+
t.after(() => instance.close())
|
|
172
|
+
t.after(() => target.close())
|
|
180
173
|
|
|
181
|
-
const { statusCode } = await
|
|
182
|
-
t.
|
|
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('
|
|
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
|
})
|