@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,17 +1,17 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const t = require('
|
|
3
|
+
const t = require('node:test')
|
|
4
4
|
const http = require('node:http')
|
|
5
5
|
const Fastify = require('fastify')
|
|
6
|
+
const { request, Agent } = require('undici')
|
|
6
7
|
const From = require('..')
|
|
7
|
-
const got = require('got')
|
|
8
8
|
const FakeTimers = require('@sinonjs/fake-timers')
|
|
9
9
|
|
|
10
10
|
const clock = FakeTimers.createClock()
|
|
11
11
|
|
|
12
12
|
t.test('undici body timeout', async (t) => {
|
|
13
13
|
const target = http.createServer((req, res) => {
|
|
14
|
-
t.
|
|
14
|
+
t.assert.ok('request proxied')
|
|
15
15
|
req.on('data', () => undefined)
|
|
16
16
|
req.on('end', () => {
|
|
17
17
|
res.writeHead(200)
|
|
@@ -19,16 +19,15 @@ t.test('undici body timeout', async (t) => {
|
|
|
19
19
|
res.write('test')
|
|
20
20
|
clock.setTimeout(() => {
|
|
21
21
|
res.end()
|
|
22
|
-
t.end()
|
|
23
22
|
}, 1000)
|
|
24
23
|
})
|
|
25
24
|
})
|
|
26
25
|
|
|
27
|
-
await target.listen({ port: 0 })
|
|
26
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
28
27
|
|
|
29
28
|
const instance = Fastify()
|
|
30
|
-
t.
|
|
31
|
-
t.
|
|
29
|
+
t.after(() => instance.close())
|
|
30
|
+
t.after(() => target.close())
|
|
32
31
|
|
|
33
32
|
instance.register(From, {
|
|
34
33
|
base: `http://localhost:${target.address().port}`,
|
|
@@ -43,14 +42,13 @@ t.test('undici body timeout', async (t) => {
|
|
|
43
42
|
|
|
44
43
|
await instance.listen({ port: 0 })
|
|
45
44
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
45
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, {
|
|
46
|
+
dispatcher: new Agent({
|
|
47
|
+
pipelining: 0
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
clock.tick(1000)
|
|
56
54
|
})
|
|
@@ -1,23 +1,22 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const t = require('
|
|
3
|
+
const t = require('node:test')
|
|
4
4
|
const http = require('node:http')
|
|
5
5
|
const Fastify = require('fastify')
|
|
6
|
+
const { request, Agent } = require('undici')
|
|
6
7
|
const From = require('..')
|
|
7
|
-
const got = require('got')
|
|
8
8
|
const FakeTimers = require('@sinonjs/fake-timers')
|
|
9
9
|
|
|
10
10
|
const clock = FakeTimers.createClock()
|
|
11
11
|
|
|
12
12
|
t.test('undici body timeout', async (t) => {
|
|
13
13
|
const target = http.createServer((req, res) => {
|
|
14
|
-
t.
|
|
14
|
+
t.assert.ok('request proxied')
|
|
15
15
|
req.on('data', () => undefined)
|
|
16
16
|
req.on('end', () => {
|
|
17
17
|
res.flushHeaders()
|
|
18
18
|
clock.setTimeout(() => {
|
|
19
19
|
res.end()
|
|
20
|
-
t.end()
|
|
21
20
|
}, 1000)
|
|
22
21
|
})
|
|
23
22
|
})
|
|
@@ -25,8 +24,8 @@ t.test('undici body timeout', async (t) => {
|
|
|
25
24
|
await target.listen({ port: 0 })
|
|
26
25
|
|
|
27
26
|
const instance = Fastify()
|
|
28
|
-
t.
|
|
29
|
-
t.
|
|
27
|
+
t.after(() => instance.close())
|
|
28
|
+
t.after(() => target.close())
|
|
30
29
|
|
|
31
30
|
instance.register(From, {
|
|
32
31
|
base: `http://localhost:${target.address().port}`,
|
|
@@ -41,19 +40,18 @@ t.test('undici body timeout', async (t) => {
|
|
|
41
40
|
|
|
42
41
|
await instance.listen({ port: 0 })
|
|
43
42
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
t.equal(err.response.statusCode, 500)
|
|
48
|
-
t.same(JSON.parse(err.response.body), {
|
|
49
|
-
statusCode: 500,
|
|
50
|
-
code: 'UND_ERR_BODY_TIMEOUT',
|
|
51
|
-
error: 'Internal Server Error',
|
|
52
|
-
message: 'Body Timeout Error'
|
|
43
|
+
const result = await request(`http://localhost:${instance.server.address().port}`, {
|
|
44
|
+
dispatcher: new Agent({
|
|
45
|
+
pipelining: 0
|
|
53
46
|
})
|
|
54
|
-
|
|
55
|
-
return
|
|
56
|
-
}
|
|
47
|
+
})
|
|
57
48
|
|
|
58
|
-
t.
|
|
49
|
+
t.assert.strictEqual(result.statusCode, 500)
|
|
50
|
+
t.assert.deepStrictEqual(await result.body.json(), {
|
|
51
|
+
statusCode: 500,
|
|
52
|
+
code: 'UND_ERR_BODY_TIMEOUT',
|
|
53
|
+
error: 'Internal Server Error',
|
|
54
|
+
message: 'Body Timeout Error'
|
|
55
|
+
})
|
|
56
|
+
clock.tick(1000)
|
|
59
57
|
})
|
|
@@ -1,18 +1,18 @@
|
|
|
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('undici request timeout', async (t) => {
|
|
10
10
|
const clock = FakeTimers.createClock()
|
|
11
11
|
const target = Fastify()
|
|
12
|
-
t.
|
|
12
|
+
t.after(() => target.close())
|
|
13
13
|
|
|
14
14
|
target.get('/', (_request, reply) => {
|
|
15
|
-
t.
|
|
15
|
+
t.assert.ok('request arrives')
|
|
16
16
|
|
|
17
17
|
setTimeout(() => {
|
|
18
18
|
reply.status(200).send('hello world')
|
|
@@ -24,7 +24,7 @@ test('undici request timeout', async (t) => {
|
|
|
24
24
|
await target.listen({ port: 0 })
|
|
25
25
|
|
|
26
26
|
const instance = Fastify()
|
|
27
|
-
t.
|
|
27
|
+
t.after(() => instance.close())
|
|
28
28
|
|
|
29
29
|
instance.register(From, {
|
|
30
30
|
base: `http://localhost:${target.server.address().port}`,
|
|
@@ -39,30 +39,30 @@ test('undici request timeout', async (t) => {
|
|
|
39
39
|
|
|
40
40
|
await instance.listen({ port: 0 })
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
t.equal(err.response.statusCode, 504)
|
|
46
|
-
t.match(err.response.headers['content-type'], /application\/json/)
|
|
47
|
-
t.same(JSON.parse(err.response.body), {
|
|
48
|
-
statusCode: 504,
|
|
49
|
-
code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
|
|
50
|
-
error: 'Gateway Timeout',
|
|
51
|
-
message: 'Gateway Timeout'
|
|
42
|
+
const result = await request(`http://localhost:${instance.server.address().port}`, {
|
|
43
|
+
dispatcher: new Agent({
|
|
44
|
+
pipelining: 0
|
|
52
45
|
})
|
|
53
|
-
|
|
54
|
-
}
|
|
46
|
+
})
|
|
55
47
|
|
|
56
|
-
t.
|
|
48
|
+
t.assert.strictEqual(result.statusCode, 504)
|
|
49
|
+
t.assert.match(result.headers['content-type'], /application\/json/)
|
|
50
|
+
t.assert.deepStrictEqual(await result.body.json(), {
|
|
51
|
+
statusCode: 504,
|
|
52
|
+
code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
|
|
53
|
+
error: 'Gateway Timeout',
|
|
54
|
+
message: 'Gateway Timeout'
|
|
55
|
+
})
|
|
56
|
+
clock.tick(1000)
|
|
57
57
|
})
|
|
58
58
|
|
|
59
59
|
test('undici request with specific timeout', async (t) => {
|
|
60
60
|
const clock = FakeTimers.createClock()
|
|
61
61
|
const target = Fastify()
|
|
62
|
-
t.
|
|
62
|
+
t.after(() => target.close())
|
|
63
63
|
|
|
64
64
|
target.get('/', (_request, reply) => {
|
|
65
|
-
t.
|
|
65
|
+
t.assert.ok('request arrives')
|
|
66
66
|
|
|
67
67
|
setTimeout(() => {
|
|
68
68
|
reply.status(200).send('hello world')
|
|
@@ -74,7 +74,7 @@ test('undici request with specific timeout', async (t) => {
|
|
|
74
74
|
await target.listen({ port: 0 })
|
|
75
75
|
|
|
76
76
|
const instance = Fastify()
|
|
77
|
-
t.
|
|
77
|
+
t.after(() => instance.close())
|
|
78
78
|
|
|
79
79
|
instance.register(From, {
|
|
80
80
|
base: `http://localhost:${target.server.address().port}`,
|
|
@@ -96,22 +96,26 @@ test('undici request with specific timeout', async (t) => {
|
|
|
96
96
|
|
|
97
97
|
await instance.listen({ port: 0 })
|
|
98
98
|
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
try {
|
|
103
|
-
await got.get(`http://localhost:${instance.server.address().port}/fail`, { retry: 0 })
|
|
104
|
-
} catch (err) {
|
|
105
|
-
t.equal(err.response.statusCode, 504)
|
|
106
|
-
t.match(err.response.headers['content-type'], /application\/json/)
|
|
107
|
-
t.same(JSON.parse(err.response.body), {
|
|
108
|
-
statusCode: 504,
|
|
109
|
-
code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
|
|
110
|
-
error: 'Gateway Timeout',
|
|
111
|
-
message: 'Gateway Timeout'
|
|
99
|
+
const result = await request(`http://localhost:${instance.server.address().port}/success`, {
|
|
100
|
+
dispatcher: new Agent({
|
|
101
|
+
pipelining: 0
|
|
112
102
|
})
|
|
113
|
-
|
|
114
|
-
|
|
103
|
+
})
|
|
104
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
115
105
|
|
|
116
|
-
|
|
106
|
+
const result2 = await request(`http://localhost:${instance.server.address().port}/fail`, {
|
|
107
|
+
dispatcher: new Agent({
|
|
108
|
+
pipelining: 0
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
t.assert.strictEqual(result2.statusCode, 504)
|
|
113
|
+
t.assert.match(result2.headers['content-type'], /application\/json/)
|
|
114
|
+
t.assert.deepStrictEqual(await result2.body.json(), {
|
|
115
|
+
statusCode: 504,
|
|
116
|
+
code: 'FST_REPLY_FROM_GATEWAY_TIMEOUT',
|
|
117
|
+
error: 'Gateway Timeout',
|
|
118
|
+
message: 'Gateway Timeout'
|
|
119
|
+
})
|
|
120
|
+
clock.tick(1000)
|
|
117
121
|
})
|
|
@@ -1,50 +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
|
|
|
11
|
-
t.
|
|
12
|
-
t.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
t.test('undici request with path in base', async (t) => {
|
|
12
|
+
t.plan(8)
|
|
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, '/hello')
|
|
19
|
+
t.assert.strictEqual(req.headers.connection, 'keep-alive')
|
|
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
|
-
})
|
|
26
|
+
instance.get('/', (_request, reply) => {
|
|
27
|
+
reply.from('/hello')
|
|
28
|
+
})
|
|
28
29
|
|
|
29
|
-
t.
|
|
30
|
+
t.after(() => target.close())
|
|
30
31
|
|
|
31
|
-
target.listen({ port: 0 },
|
|
32
|
-
t.error(err)
|
|
32
|
+
await new Promise((resolve) => target.listen({ port: 0 }, resolve))
|
|
33
33
|
|
|
34
34
|
instance.register(From, {
|
|
35
35
|
base: `http://localhost:${target.address().port}/hello`,
|
|
36
36
|
undici: true
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
instance.listen({ port: 0 },
|
|
40
|
-
t.error(err)
|
|
39
|
+
await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})
|
|
49
|
-
})
|
|
41
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
42
|
+
|
|
43
|
+
t.assert.strictEqual(result.headers['content-type'], 'text/plain')
|
|
44
|
+
t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
|
|
45
|
+
t.assert.strictEqual(result.statusCode, 205)
|
|
46
|
+
t.assert.strictEqual(await result.body.text(), 'hello world')
|
|
50
47
|
})
|
package/test/undici.test.js
CHANGED
|
@@ -1,50 +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
|
|
|
11
|
-
t.
|
|
12
|
-
t.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
t.test('undici', async (t) => {
|
|
12
|
+
t.plan(8)
|
|
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
|
+
t.assert.strictEqual(req.headers.connection, 'keep-alive')
|
|
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
|
-
})
|
|
26
|
+
instance.get('/', (_request, reply) => {
|
|
27
|
+
reply.from()
|
|
28
|
+
})
|
|
28
29
|
|
|
29
|
-
t.
|
|
30
|
+
t.after(() => target.close())
|
|
30
31
|
|
|
31
|
-
target.listen({ port: 0 },
|
|
32
|
-
t.error(err)
|
|
32
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
33
33
|
|
|
34
34
|
instance.register(From, {
|
|
35
35
|
base: `http://localhost:${target.address().port}`,
|
|
36
36
|
undici: true
|
|
37
37
|
})
|
|
38
38
|
|
|
39
|
-
instance.listen({ port: 0 },
|
|
40
|
-
t.error(err)
|
|
39
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
})
|
|
49
|
-
})
|
|
41
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
42
|
+
|
|
43
|
+
t.assert.strictEqual(result.headers['content-type'], 'text/plain')
|
|
44
|
+
t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
|
|
45
|
+
t.assert.strictEqual(result.statusCode, 205)
|
|
46
|
+
t.assert.strictEqual(await result.body.text(), 'hello world')
|
|
50
47
|
})
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { test } = require('
|
|
3
|
+
const { test } = require('node:test')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
|
-
const
|
|
5
|
+
const { request } = require('undici')
|
|
6
6
|
const proxyquire = require('proxyquire')
|
|
7
7
|
|
|
8
8
|
// Stub request to throw error 'foo'
|
|
@@ -18,10 +18,10 @@ const From = proxyquire('..', {
|
|
|
18
18
|
test('unexpected error renders 500', async (t) => {
|
|
19
19
|
const instance = Fastify()
|
|
20
20
|
|
|
21
|
-
t.
|
|
21
|
+
t.after(() => instance.close())
|
|
22
22
|
|
|
23
23
|
instance.get('/', (_request, reply) => {
|
|
24
|
-
reply.code(
|
|
24
|
+
reply.code(205)
|
|
25
25
|
reply.from()
|
|
26
26
|
})
|
|
27
27
|
instance.register(From, {
|
|
@@ -30,18 +30,13 @@ test('unexpected error renders 500', async (t) => {
|
|
|
30
30
|
|
|
31
31
|
await instance.listen({ port: 0 })
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
message: 'foo'
|
|
43
|
-
})
|
|
44
|
-
return
|
|
45
|
-
}
|
|
46
|
-
t.fail()
|
|
33
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
34
|
+
t.assert.strictEqual(result.statusCode, 500)
|
|
35
|
+
t.assert.match(result.headers['content-type'], /application\/json/)
|
|
36
|
+
t.assert.deepStrictEqual(await result.body.json(), {
|
|
37
|
+
statusCode: 500,
|
|
38
|
+
code: 'FST_REPLY_FROM_INTERNAL_SERVER_ERROR',
|
|
39
|
+
error: 'Internal Server Error',
|
|
40
|
+
message: 'foo'
|
|
41
|
+
})
|
|
47
42
|
})
|
|
@@ -1,51 +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 fs = require('node:fs')
|
|
7
8
|
const querystring = require('node:querystring')
|
|
8
9
|
const http = require('node:http')
|
|
9
|
-
const get = require('simple-get').concat
|
|
10
|
-
|
|
11
|
-
if (process.platform === 'win32') {
|
|
12
|
-
t.pass()
|
|
13
|
-
process.exit(0)
|
|
14
|
-
}
|
|
15
10
|
|
|
16
11
|
const instance = Fastify()
|
|
17
12
|
instance.register(From)
|
|
18
13
|
|
|
19
|
-
t.
|
|
20
|
-
t.
|
|
14
|
+
t.test('unix http undici from', { skip: process.platform === 'win32' }, async (t) => {
|
|
15
|
+
t.plan(1)
|
|
16
|
+
t.after(() => instance.close())
|
|
21
17
|
|
|
22
|
-
const socketPath = `${__filename}.socket`
|
|
18
|
+
const socketPath = `${__filename}.socket`
|
|
23
19
|
|
|
24
|
-
try {
|
|
25
|
-
|
|
26
|
-
} catch (_) {
|
|
27
|
-
}
|
|
20
|
+
try {
|
|
21
|
+
fs.unlinkSync(socketPath)
|
|
22
|
+
} catch (_) {
|
|
23
|
+
}
|
|
28
24
|
|
|
29
|
-
const target = http.createServer((_req, res) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
})
|
|
25
|
+
const target = http.createServer((_req, res) => {
|
|
26
|
+
t.fail('no response')
|
|
27
|
+
res.end()
|
|
28
|
+
})
|
|
33
29
|
|
|
34
|
-
instance.get('/', (_request, reply) => {
|
|
35
|
-
|
|
36
|
-
})
|
|
30
|
+
instance.get('/', (_request, reply) => {
|
|
31
|
+
reply.from(`unix+http://${querystring.escape(socketPath)}/hello`)
|
|
32
|
+
})
|
|
37
33
|
|
|
38
|
-
t.
|
|
34
|
+
t.after(() => target.close())
|
|
39
35
|
|
|
40
|
-
instance.listen({ port: 0 }
|
|
41
|
-
t.error(err)
|
|
36
|
+
await instance.listen({ port: 0 })
|
|
42
37
|
|
|
43
|
-
target.listen(socketPath,
|
|
44
|
-
t.error(err)
|
|
38
|
+
await new Promise(resolve => target.listen(socketPath, resolve))
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
t.equal(res.statusCode, 500)
|
|
49
|
-
})
|
|
50
|
-
})
|
|
40
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
41
|
+
t.assert.strictEqual(result.statusCode, 500)
|
|
51
42
|
})
|
|
@@ -1,17 +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 fs = require('node:fs')
|
|
7
8
|
const querystring = require('node:querystring')
|
|
8
9
|
const http = require('node:http')
|
|
9
|
-
const get = require('simple-get').concat
|
|
10
|
-
|
|
11
|
-
if (process.platform === 'win32') {
|
|
12
|
-
t.pass()
|
|
13
|
-
process.exit(0)
|
|
14
|
-
}
|
|
15
10
|
|
|
16
11
|
const socketPath = `${__filename}.socket`
|
|
17
12
|
const upstream = `unix+http://${querystring.escape(socketPath)}/`
|
|
@@ -21,42 +16,39 @@ instance.register(From, {
|
|
|
21
16
|
base: upstream
|
|
22
17
|
})
|
|
23
18
|
|
|
24
|
-
t.
|
|
25
|
-
t.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
19
|
+
t.test('unix http undici', { skip: process.platform === 'win32' }, async t => {
|
|
20
|
+
t.plan(7)
|
|
21
|
+
t.after(() => instance.close())
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
fs.unlinkSync(socketPath)
|
|
25
|
+
} catch (_) {
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const target = http.createServer((req, res) => {
|
|
29
|
+
t.assert.ok('request proxied')
|
|
30
|
+
t.assert.strictEqual(req.method, 'GET')
|
|
31
|
+
t.assert.strictEqual(req.url, '/hello')
|
|
32
|
+
res.statusCode = 205
|
|
33
|
+
res.setHeader('Content-Type', 'text/plain')
|
|
34
|
+
res.setHeader('x-my-header', 'hello!')
|
|
35
|
+
res.end('hello world')
|
|
36
|
+
})
|
|
41
37
|
|
|
42
|
-
instance.get('/', (_request, reply) => {
|
|
43
|
-
|
|
44
|
-
})
|
|
38
|
+
instance.get('/', (_request, reply) => {
|
|
39
|
+
reply.from('hello')
|
|
40
|
+
})
|
|
45
41
|
|
|
46
|
-
t.
|
|
42
|
+
t.after(() => target.close())
|
|
47
43
|
|
|
48
|
-
instance.listen({ port: 0 }
|
|
49
|
-
t.error(err)
|
|
44
|
+
await instance.listen({ port: 0 })
|
|
50
45
|
|
|
51
|
-
target.listen(socketPath,
|
|
52
|
-
t.error(err)
|
|
46
|
+
await new Promise(resolve => target.listen(socketPath, resolve))
|
|
53
47
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
})
|
|
61
|
-
})
|
|
48
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
49
|
+
|
|
50
|
+
t.assert.strictEqual(result.headers['content-type'], 'text/plain')
|
|
51
|
+
t.assert.strictEqual(result.headers['x-my-header'], 'hello!')
|
|
52
|
+
t.assert.strictEqual(result.statusCode, 205)
|
|
53
|
+
t.assert.strictEqual(await result.body.text(), 'hello world')
|
|
62
54
|
})
|