@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
package/test/undici-body.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('undici body', 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.strictEqual(req.method, 'POST')
|
|
22
|
+
t.assert.strictEqual(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.post('/', (_request, reply) => {
|
|
37
|
-
|
|
38
|
-
})
|
|
37
|
+
instance.post('/', (_request, reply) => {
|
|
38
|
+
reply.from(`http://localhost:${target.address().port}`)
|
|
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: 'POST',
|
|
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,57 +1,50 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const t = require('
|
|
3
|
+
const t = require('node:test')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
|
-
const
|
|
5
|
+
const { request } = require('undici')
|
|
6
6
|
const From = require('..')
|
|
7
7
|
|
|
8
8
|
const header = 'attachment; filename="år.pdf"'
|
|
9
9
|
|
|
10
|
-
t.
|
|
10
|
+
t.test('undici chaining', async (t) => {
|
|
11
|
+
t.plan(2)
|
|
11
12
|
|
|
12
|
-
const instance = Fastify()
|
|
13
|
-
t.
|
|
14
|
-
const proxy1 = Fastify()
|
|
15
|
-
t.
|
|
16
|
-
const proxy2 = Fastify()
|
|
17
|
-
t.
|
|
13
|
+
const instance = Fastify()
|
|
14
|
+
t.after(() => instance.close())
|
|
15
|
+
const proxy1 = Fastify()
|
|
16
|
+
t.after(() => proxy1.close())
|
|
17
|
+
const proxy2 = Fastify()
|
|
18
|
+
t.after(() => proxy2.close())
|
|
18
19
|
|
|
19
|
-
instance.get('/', (_request, reply) => {
|
|
20
|
-
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
proxy1.register(From, {
|
|
24
|
-
undici: {
|
|
25
|
-
keepAliveMaxTimeout: 10
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
-
proxy1.get('/', (_request, reply) => {
|
|
29
|
-
return reply.from(`http://localhost:${instance.server.address().port}`)
|
|
30
|
-
})
|
|
20
|
+
instance.get('/', (_request, reply) => {
|
|
21
|
+
reply.header('content-disposition', header).send('OK')
|
|
22
|
+
})
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
})
|
|
24
|
+
proxy1.register(From, {
|
|
25
|
+
undici: {
|
|
26
|
+
keepAliveMaxTimeout: 10
|
|
27
|
+
}
|
|
28
|
+
})
|
|
29
|
+
proxy1.get('/', (_request, reply) => {
|
|
30
|
+
return reply.from(`http://localhost:${instance.server.address().port}`)
|
|
31
|
+
})
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
|
|
33
|
+
proxy2.register(From, {
|
|
34
|
+
undici: {
|
|
35
|
+
keepAliveMaxTimeout: 10
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
proxy2.get('/', (_request, reply) => {
|
|
39
|
+
return reply.from(`http://localhost:${proxy1.server.address().port}`)
|
|
40
|
+
})
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
|
|
43
|
+
await new Promise((resolve) => proxy1.listen({ port: 0 }, resolve))
|
|
44
|
+
await new Promise((resolve) => proxy2.listen({ port: 0 }, resolve))
|
|
46
45
|
|
|
47
|
-
|
|
48
|
-
t.error(err)
|
|
46
|
+
const result = await request(`http://localhost:${proxy2.server.address().port}`)
|
|
49
47
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
t.equal(res.statusCode, 200)
|
|
53
|
-
t.equal(data.toString(), 'OK')
|
|
54
|
-
})
|
|
55
|
-
})
|
|
56
|
-
})
|
|
48
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
49
|
+
t.assert.strictEqual(await result.body.text(), 'OK')
|
|
57
50
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
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 net = require('node:net')
|
|
6
6
|
const Fastify = require('fastify')
|
|
7
7
|
const From = require('..')
|
|
8
|
-
const
|
|
8
|
+
const { request, Agent } = require('undici')
|
|
9
9
|
|
|
10
10
|
t.test('undici connect timeout', async (t) => {
|
|
11
11
|
// never connect
|
|
@@ -18,11 +18,11 @@ t.test('undici connect timeout', async (t) => {
|
|
|
18
18
|
})
|
|
19
19
|
|
|
20
20
|
t.plan(2)
|
|
21
|
-
await target.listen({ port: 0 })
|
|
21
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
22
22
|
|
|
23
23
|
const instance = Fastify()
|
|
24
|
-
t.
|
|
25
|
-
t.
|
|
24
|
+
t.after(() => instance.close())
|
|
25
|
+
t.after(() => target.close())
|
|
26
26
|
|
|
27
27
|
instance.register(From, {
|
|
28
28
|
base: `http://localhost:${target.address().port}`,
|
|
@@ -38,15 +38,15 @@ t.test('undici connect timeout', async (t) => {
|
|
|
38
38
|
await instance.listen({ port: 0 })
|
|
39
39
|
|
|
40
40
|
try {
|
|
41
|
-
await
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
code: 'UND_ERR_CONNECT_TIMEOUT',
|
|
47
|
-
error: 'Internal Server Error',
|
|
48
|
-
message: 'Connect Timeout Error'
|
|
41
|
+
await request(`http://localhost:${instance.server.address().port}/`, {
|
|
42
|
+
dispatcher: new Agent({
|
|
43
|
+
pipelining: 0,
|
|
44
|
+
connectTimeout: 10
|
|
45
|
+
})
|
|
49
46
|
})
|
|
47
|
+
} catch (err) {
|
|
48
|
+
t.assert.strictEqual(err.code, 'UND_ERR_CONNECT_TIMEOUT')
|
|
49
|
+
t.assert.strictEqual(err.name, 'ConnectTimeoutError')
|
|
50
50
|
return
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { test } = require('
|
|
4
|
-
const undici = require('undici')
|
|
3
|
+
const { test } = require('node:test')
|
|
5
4
|
const Fastify = require('fastify')
|
|
5
|
+
const { request, Pool } = require('undici')
|
|
6
6
|
const From = require('..')
|
|
7
7
|
|
|
8
8
|
class CustomDispatcher {
|
|
9
9
|
constructor (...args) {
|
|
10
|
-
this._dispatcher = new
|
|
10
|
+
this._dispatcher = new Pool(...args)
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
request (...args) {
|
|
@@ -29,7 +29,7 @@ test('use a custom instance of \'undici\'', async t => {
|
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
target.get('/', (_req, reply) => {
|
|
32
|
-
t.
|
|
32
|
+
t.assert.ok('request proxied')
|
|
33
33
|
|
|
34
34
|
reply.headers({
|
|
35
35
|
'Content-Type': 'text/plain',
|
|
@@ -41,7 +41,7 @@ test('use a custom instance of \'undici\'', async t => {
|
|
|
41
41
|
})
|
|
42
42
|
|
|
43
43
|
await target.listen({ port: 3001 })
|
|
44
|
-
t.
|
|
44
|
+
t.after(async () => {
|
|
45
45
|
await target.close()
|
|
46
46
|
})
|
|
47
47
|
|
|
@@ -58,16 +58,16 @@ test('use a custom instance of \'undici\'', async t => {
|
|
|
58
58
|
})
|
|
59
59
|
|
|
60
60
|
await instance.listen({ port: 0 })
|
|
61
|
-
t.
|
|
61
|
+
t.after(async () => {
|
|
62
62
|
await instance.close()
|
|
63
63
|
})
|
|
64
64
|
|
|
65
|
-
const res = await
|
|
65
|
+
const res = await request(`http://localhost:${instance.server.address().port}`)
|
|
66
66
|
|
|
67
|
-
t.
|
|
68
|
-
t.
|
|
69
|
-
t.
|
|
67
|
+
t.assert.strictEqual(res.headers['content-type'], 'text/plain')
|
|
68
|
+
t.assert.strictEqual(res.headers['x-my-header'], 'hello!')
|
|
69
|
+
t.assert.strictEqual(res.statusCode, 205)
|
|
70
70
|
|
|
71
71
|
const data = await res.body.text()
|
|
72
|
-
t.
|
|
72
|
+
t.assert.strictEqual(data, 'hello world')
|
|
73
73
|
})
|
|
@@ -1,9 +1,9 @@
|
|
|
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 http = require('node:http')
|
|
6
|
-
const get = require('simple-get').concat
|
|
7
7
|
const undici = require('undici')
|
|
8
8
|
const From = require('..')
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ test('undici global agent is used, but not destroyed', async (t) => {
|
|
|
15
15
|
undici.setGlobalDispatcher(mockAgent)
|
|
16
16
|
const instance = Fastify()
|
|
17
17
|
|
|
18
|
-
t.
|
|
18
|
+
t.after(() => instance.close())
|
|
19
19
|
|
|
20
20
|
const target = http.createServer((_req, res) => {
|
|
21
21
|
res.statusCode = 200
|
|
@@ -26,41 +26,22 @@ test('undici global agent is used, but not destroyed', async (t) => {
|
|
|
26
26
|
reply.from()
|
|
27
27
|
})
|
|
28
28
|
|
|
29
|
-
t.
|
|
29
|
+
t.after(() => target.close())
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
target.listen({ port: 0 }, (err) => {
|
|
33
|
-
t.error(err)
|
|
31
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
34
32
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
instance.listen({ port: 0 }, (err) => {
|
|
41
|
-
t.error(err)
|
|
33
|
+
instance.register(From, {
|
|
34
|
+
base: `http://localhost:${target.address().port}`,
|
|
35
|
+
globalAgent: true
|
|
36
|
+
})
|
|
42
37
|
|
|
43
|
-
|
|
44
|
-
`http://localhost:${instance.server.address().port}`,
|
|
45
|
-
(err, res) => {
|
|
46
|
-
t.error(err)
|
|
47
|
-
t.equal(res.statusCode, 200)
|
|
38
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
48
39
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
(err, res) => {
|
|
52
|
-
t.error(err)
|
|
53
|
-
t.equal(res.statusCode, 200)
|
|
54
|
-
resolve()
|
|
55
|
-
}
|
|
56
|
-
)
|
|
57
|
-
}
|
|
58
|
-
)
|
|
59
|
-
})
|
|
60
|
-
})
|
|
61
|
-
})
|
|
40
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
41
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
62
42
|
|
|
63
|
-
await
|
|
43
|
+
const result1 = await request(`http://localhost:${instance.server.address().port}`)
|
|
44
|
+
t.assert.strictEqual(result1.statusCode, 200)
|
|
64
45
|
|
|
65
46
|
target.close()
|
|
66
47
|
})
|
|
@@ -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 undici = require('undici')
|
|
6
6
|
const From = require('..')
|
|
@@ -12,7 +12,7 @@ test('destroyAgent false', async (t) => {
|
|
|
12
12
|
}
|
|
13
13
|
const instance = Fastify()
|
|
14
14
|
|
|
15
|
-
t.
|
|
15
|
+
t.after(() => instance.close())
|
|
16
16
|
|
|
17
17
|
instance.get('/', (_request, reply) => {
|
|
18
18
|
reply.from()
|
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const t = require('
|
|
3
|
+
const t = require('node:test')
|
|
4
|
+
const assert = require('node:assert')
|
|
4
5
|
const Fastify = require('fastify')
|
|
6
|
+
const { request } = require('undici')
|
|
5
7
|
const proxyquire = require('proxyquire')
|
|
6
8
|
const http = require('node:http')
|
|
7
|
-
const get = require('simple-get').concat
|
|
8
9
|
const undici = require('undici')
|
|
9
10
|
const { getUndiciOptions } = require('../lib/request')
|
|
10
11
|
|
|
11
12
|
const instance = Fastify()
|
|
12
13
|
|
|
13
|
-
t.
|
|
14
|
-
t.
|
|
14
|
+
t.test('undici options', async (t) => {
|
|
15
|
+
t.plan(2)
|
|
16
|
+
t.after(() => instance.close())
|
|
15
17
|
|
|
16
|
-
const target = http.createServer((_req, res) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
})
|
|
18
|
+
const target = http.createServer((_req, res) => {
|
|
19
|
+
res.statusCode = 200
|
|
20
|
+
res.end('hello world')
|
|
21
|
+
})
|
|
20
22
|
|
|
21
|
-
instance.get('/', (_request, reply) => {
|
|
22
|
-
|
|
23
|
-
})
|
|
23
|
+
instance.get('/', (_request, reply) => {
|
|
24
|
+
reply.from()
|
|
25
|
+
})
|
|
24
26
|
|
|
25
|
-
t.
|
|
27
|
+
t.after(() => target.close())
|
|
26
28
|
|
|
27
|
-
target.listen({ port: 0 },
|
|
28
|
-
t.error(err)
|
|
29
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
29
30
|
|
|
30
31
|
const From = proxyquire('..', {
|
|
31
32
|
'./lib/request.js': proxyquire('../lib/request.js', {
|
|
@@ -38,28 +39,24 @@ target.listen({ port: 0 }, err => {
|
|
|
38
39
|
undici: buildUndiciOptions()
|
|
39
40
|
})
|
|
40
41
|
|
|
41
|
-
instance.listen({ port: 0 },
|
|
42
|
-
t.error(err)
|
|
42
|
+
await new Promise(resolve => instance.listen({ port: 0 }, resolve))
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
t.equal(data.toString(), 'hello world')
|
|
48
|
-
})
|
|
49
|
-
})
|
|
44
|
+
const result = await request(`http://localhost:${instance.server.address().port}`)
|
|
45
|
+
t.assert.strictEqual(result.statusCode, 200)
|
|
46
|
+
t.assert.strictEqual(await result.body.text(), 'hello world')
|
|
50
47
|
})
|
|
51
48
|
|
|
52
49
|
function undiciProxy () {}
|
|
53
50
|
undiciProxy.Agent = class Agent extends undici.Agent {
|
|
54
51
|
constructor (opts) {
|
|
55
52
|
super(opts)
|
|
56
|
-
|
|
53
|
+
assert.deepStrictEqual(opts, buildUndiciOptions())
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
undiciProxy.Pool = class Pool extends undici.Pool {
|
|
60
57
|
constructor (url, options) {
|
|
61
58
|
super(url, options)
|
|
62
|
-
|
|
59
|
+
assert.deepStrictEqual(options, buildUndiciOptions())
|
|
63
60
|
}
|
|
64
61
|
}
|
|
65
62
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const { test, after } = require('node:test')
|
|
4
4
|
const { createServer } = require('node:http')
|
|
5
5
|
const Fastify = require('fastify')
|
|
6
|
+
const { request } = require('undici')
|
|
6
7
|
const { createProxy } = require('proxy')
|
|
7
8
|
const fastifyProxyFrom = require('..')
|
|
8
9
|
const { isIPv6 } = require('node:net')
|
|
@@ -78,10 +79,10 @@ for (const [description, format] of Object.entries(configFormat)) {
|
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
|
|
81
|
-
const response = await
|
|
82
|
+
const response = await request(`http://localhost:${instance.server.address().port}`)
|
|
82
83
|
|
|
83
|
-
t.assert.strictEqual(response.
|
|
84
|
-
t.assert.deepStrictEqual(await response.json(), { hello: 'world' })
|
|
84
|
+
t.assert.strictEqual(response.statusCode, 200)
|
|
85
|
+
t.assert.deepStrictEqual(await response.body.json(), { hello: 'world' })
|
|
85
86
|
})
|
|
86
87
|
}
|
|
87
88
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const Fastify = require('fastify')
|
|
4
|
+
const { request, Agent } = require('undici')
|
|
4
5
|
const From = require('..')
|
|
5
|
-
const
|
|
6
|
-
const { test } = require('tap')
|
|
6
|
+
const { test } = require('node:test')
|
|
7
7
|
|
|
8
8
|
let retryNum = 1
|
|
9
9
|
|
|
@@ -20,10 +20,10 @@ const target = require('node:http').createServer(function (req, res) {
|
|
|
20
20
|
})
|
|
21
21
|
|
|
22
22
|
test('Will retry', async function (t) {
|
|
23
|
-
t.
|
|
23
|
+
t.after(() => { retryNum = 1 })
|
|
24
24
|
|
|
25
|
-
await target.listen({ port: 0 })
|
|
26
|
-
t.
|
|
25
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
26
|
+
t.after(() => target.close())
|
|
27
27
|
|
|
28
28
|
const instance = Fastify()
|
|
29
29
|
|
|
@@ -33,24 +33,24 @@ test('Will retry', async function (t) {
|
|
|
33
33
|
reply.from(`http://localhost:${target.address().port}/`, {
|
|
34
34
|
retriesCount: 1,
|
|
35
35
|
onError: (reply, { error }) => {
|
|
36
|
-
t.
|
|
36
|
+
t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
|
|
37
37
|
reply.send(error)
|
|
38
38
|
}
|
|
39
39
|
})
|
|
40
40
|
})
|
|
41
41
|
|
|
42
42
|
await instance.listen({ port: 0 })
|
|
43
|
-
t.
|
|
43
|
+
t.after(() => instance.close())
|
|
44
44
|
|
|
45
|
-
const { statusCode } = await
|
|
46
|
-
t.
|
|
45
|
+
const { statusCode } = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
|
|
46
|
+
t.assert.strictEqual(statusCode, 200)
|
|
47
47
|
})
|
|
48
48
|
|
|
49
49
|
test('will not retry', async function (t) {
|
|
50
|
-
t.
|
|
50
|
+
t.after(() => { retryNum = 1 })
|
|
51
51
|
|
|
52
|
-
await target.listen({ port: 0 })
|
|
53
|
-
t.
|
|
52
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
53
|
+
t.after(() => target.close())
|
|
54
54
|
|
|
55
55
|
const instance = Fastify()
|
|
56
56
|
|
|
@@ -60,28 +60,25 @@ test('will not retry', async function (t) {
|
|
|
60
60
|
reply.from(`http://localhost:${target.address().port}/`, {
|
|
61
61
|
retriesCount: 0,
|
|
62
62
|
onError: (reply, { error }) => {
|
|
63
|
-
t.
|
|
63
|
+
t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
|
|
64
64
|
reply.send(error)
|
|
65
65
|
}
|
|
66
66
|
})
|
|
67
67
|
})
|
|
68
68
|
|
|
69
69
|
await instance.listen({ port: 0 })
|
|
70
|
-
t.
|
|
70
|
+
t.after(() => instance.close())
|
|
71
71
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
} catch (err) {
|
|
76
|
-
t.equal(err.response.statusCode, 500)
|
|
77
|
-
}
|
|
72
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
|
|
73
|
+
|
|
74
|
+
t.assert.strictEqual(result.statusCode, 500)
|
|
78
75
|
})
|
|
79
76
|
|
|
80
77
|
test('will not retry unsupported method', async function (t) {
|
|
81
|
-
t.
|
|
78
|
+
t.after(() => { retryNum = 1 })
|
|
82
79
|
|
|
83
|
-
await target.listen({ port: 0 })
|
|
84
|
-
t.
|
|
80
|
+
await new Promise(resolve => target.listen({ port: 0 }, resolve))
|
|
81
|
+
t.after(() => target.close())
|
|
85
82
|
|
|
86
83
|
const instance = Fastify()
|
|
87
84
|
|
|
@@ -91,19 +88,15 @@ test('will not retry unsupported method', async function (t) {
|
|
|
91
88
|
reply.from(`http://localhost:${target.address().port}/`, {
|
|
92
89
|
retriesCount: 1,
|
|
93
90
|
onError: (reply, { error }) => {
|
|
94
|
-
t.
|
|
91
|
+
t.assert.strictEqual(error.code, 'UND_ERR_SOCKET')
|
|
95
92
|
reply.send(error)
|
|
96
93
|
}
|
|
97
94
|
})
|
|
98
95
|
})
|
|
99
96
|
|
|
100
97
|
await instance.listen({ port: 0 })
|
|
101
|
-
t.
|
|
98
|
+
t.after(() => instance.close())
|
|
102
99
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
t.fail()
|
|
106
|
-
} catch (err) {
|
|
107
|
-
t.equal(err.response.statusCode, 500)
|
|
108
|
-
}
|
|
100
|
+
const result = await request(`http://localhost:${instance.server.address().port}/`, { dispatcher: new Agent({ pipelining: 0 }) })
|
|
101
|
+
t.assert.strictEqual(result.statusCode, 500)
|
|
109
102
|
})
|