@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.
Files changed (107) hide show
  1. package/.github/workflows/ci.yml +3 -0
  2. package/CLAUDE.md +66 -0
  3. package/LICENSE +4 -1
  4. package/README.md +20 -0
  5. package/index.js +10 -0
  6. package/lib/request.js +11 -2
  7. package/lib/utils.js +1 -0
  8. package/package.json +6 -8
  9. package/test/async-route-handler.test.js +29 -32
  10. package/test/balanced-pool.test.js +48 -0
  11. package/test/base-get.test.js +27 -30
  12. package/test/base-path.test.js +27 -24
  13. package/test/base-querystring.test.js +27 -30
  14. package/test/build-url.test.js +17 -15
  15. package/test/core-with-path-in-base.test.js +30 -33
  16. package/test/custom-undici-instance.test.js +28 -36
  17. package/test/disable-request-logging.test.js +38 -52
  18. package/test/fastify-multipart-incompatibility.test.js +43 -49
  19. package/test/fix-GHSA-v2v2-hph8-q5xp.test.js +3 -2
  20. package/test/full-delete-http2.test.js +12 -11
  21. package/test/full-get-test.test.js +27 -30
  22. package/test/full-https-get.test.js +30 -30
  23. package/test/full-post-extended-content-type.test.js +40 -44
  24. package/test/full-post-http2.test.js +18 -13
  25. package/test/full-post-stream-core.test.js +39 -43
  26. package/test/full-post-stream.test.js +39 -43
  27. package/test/full-post.test.js +36 -38
  28. package/test/full-querystring-rewrite-option-complex.test.js +27 -31
  29. package/test/full-querystring-rewrite-option-function-request.test.js +30 -36
  30. package/test/full-querystring-rewrite-option-function.test.js +30 -33
  31. package/test/full-querystring-rewrite-option.test.js +28 -31
  32. package/test/full-querystring-rewrite-string.test.js +27 -30
  33. package/test/full-querystring-rewrite.test.js +27 -30
  34. package/test/full-querystring.test.js +27 -30
  35. package/test/full-rewrite-body-content-type.test.js +37 -41
  36. package/test/full-rewrite-body-http.test.js +39 -43
  37. package/test/full-rewrite-body-to-empty-string.test.js +37 -41
  38. package/test/full-rewrite-body-to-null.test.js +37 -41
  39. package/test/full-rewrite-body.test.js +39 -43
  40. package/test/get-upstream-cache.test.js +12 -11
  41. package/test/get-upstream-http.test.js +35 -41
  42. package/test/get-upstream-type.test.js +24 -27
  43. package/test/get-upstream-undici.test.js +23 -26
  44. package/test/host-header.test.js +22 -18
  45. package/test/http-agents.test.js +27 -30
  46. package/test/http-global-agent.test.js +20 -33
  47. package/test/http-http2.test.js +13 -18
  48. package/test/http-invalid-target.test.js +13 -17
  49. package/test/http-retry.test.js +22 -29
  50. package/test/http-timeout.test.js +49 -42
  51. package/test/http2-canceled-streams-cleanup.test.js +117 -0
  52. package/test/http2-http2.test.js +8 -8
  53. package/test/http2-https.test.js +29 -27
  54. package/test/http2-invalid-base.test.js +2 -2
  55. package/test/http2-invalid-target.test.js +13 -17
  56. package/test/http2-target-crash.test.js +16 -20
  57. package/test/http2-target-multi-crash.test.js +22 -27
  58. package/test/http2-timeout-disabled.test.js +20 -15
  59. package/test/http2-timeout.test.js +58 -65
  60. package/test/http2-unix-socket.test.js +2 -2
  61. package/test/https-agents.test.js +31 -30
  62. package/test/https-global-agent.test.js +22 -31
  63. package/test/method.test.js +37 -42
  64. package/test/modifyCoreObjects-false.test.js +27 -30
  65. package/test/no-body-opts-with-get.test.js +25 -31
  66. package/test/no-body-opts-with-head.test.js +28 -32
  67. package/test/no-stream-body-option.test.js +34 -36
  68. package/test/on-error.test.js +21 -23
  69. package/test/on-invalid-upstream-response.test.js +30 -37
  70. package/test/onResponse.test.js +25 -32
  71. package/test/padded-body.test.js +38 -43
  72. package/test/post-formbody.test.js +35 -40
  73. package/test/post-plain-text.test.js +35 -39
  74. package/test/post-with-custom-encoded-contenttype.test.js +37 -39
  75. package/test/post-with-octet-stream.test.js +18 -88
  76. package/test/retry-on-503.test.js +27 -26
  77. package/test/retry-with-a-custom-handler.test.js +33 -40
  78. package/test/rewrite-headers-type.test.js +24 -29
  79. package/test/rewrite-headers.test.js +31 -36
  80. package/test/rewrite-request-headers-type.test.js +25 -28
  81. package/test/rewrite-request-headers.test.js +26 -30
  82. package/test/transform-body.test.js +37 -43
  83. package/test/undici-agent.test.js +27 -31
  84. package/test/undici-body.test.js +37 -42
  85. package/test/undici-chaining.test.js +35 -42
  86. package/test/undici-connect-timeout.test.js +13 -13
  87. package/test/undici-custom-dispatcher.test.js +11 -11
  88. package/test/undici-global-agent.test.js +14 -33
  89. package/test/undici-no-destroy.test.js +2 -2
  90. package/test/undici-options.test.js +21 -24
  91. package/test/undici-proxy-agent.test.js +4 -3
  92. package/test/undici-retry.test.js +24 -31
  93. package/test/undici-timeout-body-partial.test.js +14 -16
  94. package/test/undici-timeout-body.test.js +17 -19
  95. package/test/undici-timeout.test.js +41 -37
  96. package/test/undici-with-path-in-base.test.js +28 -31
  97. package/test/undici.test.js +28 -31
  98. package/test/unexpected-error.test.js +13 -18
  99. package/test/unix-http-undici-from.test.js +22 -31
  100. package/test/unix-http-undici.test.js +32 -40
  101. package/test/unix-http.test.js +31 -39
  102. package/test/unix-https-undici.test.js +30 -35
  103. package/test/unix-https.test.js +35 -40
  104. package/types/index.d.ts +9 -2
  105. package/types/index.test-d.ts +3 -4
  106. package/test/get-with-body.test.js +0 -55
  107. package/test/head-with-body.test.js +0 -57
@@ -1,17 +1,17 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
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.pass('request proxied')
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.teardown(instance.close.bind(instance))
31
- t.teardown(target.close.bind(target))
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
- try {
47
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
48
- } catch (err) {
49
- t.equal(err.code, 'ECONNRESET')
50
- t.equal(err.response.statusCode, 200)
51
- clock.tick(1000)
52
- return
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
- t.fail()
53
+ clock.tick(1000)
56
54
  })
@@ -1,23 +1,22 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
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.pass('request proxied')
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.teardown(instance.close.bind(instance))
29
- t.teardown(target.close.bind(target))
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
- try {
45
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
46
- } catch (err) {
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
- clock.tick(1000)
55
- return
56
- }
47
+ })
57
48
 
58
- t.fail()
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('tap')
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.teardown(target.close.bind(target))
12
+ t.after(() => target.close())
13
13
 
14
14
  target.get('/', (_request, reply) => {
15
- t.pass('request arrives')
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.teardown(instance.close.bind(instance))
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
- try {
43
- await got.get(`http://localhost:${instance.server.address().port}/`, { retry: 0 })
44
- } catch (err) {
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
- return
54
- }
46
+ })
55
47
 
56
- t.fail()
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.teardown(target.close.bind(target))
62
+ t.after(() => target.close())
63
63
 
64
64
  target.get('/', (_request, reply) => {
65
- t.pass('request arrives')
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.teardown(instance.close.bind(instance))
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 { statusCode } = await got.get(`http://localhost:${instance.server.address().port}/success`, { retry: 0 })
100
- t.equal(statusCode, 200)
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
- return
114
- }
103
+ })
104
+ t.assert.strictEqual(result.statusCode, 200)
115
105
 
116
- t.fail()
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('tap')
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.plan(11)
12
- t.teardown(instance.close.bind(instance))
13
-
14
- const target = http.createServer((req, res) => {
15
- t.pass('request proxied')
16
- t.equal(req.method, 'GET')
17
- t.equal(req.url, '/hello')
18
- t.equal(req.headers.connection, 'keep-alive')
19
- res.statusCode = 205
20
- res.setHeader('Content-Type', 'text/plain')
21
- res.setHeader('x-my-header', 'hello!')
22
- res.end('hello world')
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
- reply.from('/hello')
27
- })
26
+ instance.get('/', (_request, reply) => {
27
+ reply.from('/hello')
28
+ })
28
29
 
29
- t.teardown(target.close.bind(target))
30
+ t.after(() => target.close())
30
31
 
31
- target.listen({ port: 0 }, (err) => {
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 }, (err) => {
40
- t.error(err)
39
+ await new Promise((resolve) => instance.listen({ port: 0 }, resolve))
41
40
 
42
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
43
- t.error(err)
44
- t.equal(res.headers['content-type'], 'text/plain')
45
- t.equal(res.headers['x-my-header'], 'hello!')
46
- t.equal(res.statusCode, 205)
47
- t.equal(data.toString(), 'hello world')
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,50 +1,47 @@
1
1
  'use strict'
2
2
 
3
- const t = require('tap')
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.plan(11)
12
- t.teardown(instance.close.bind(instance))
13
-
14
- const target = http.createServer((req, res) => {
15
- t.pass('request proxied')
16
- t.equal(req.method, 'GET')
17
- t.equal(req.url, '/')
18
- t.equal(req.headers.connection, 'keep-alive')
19
- res.statusCode = 205
20
- res.setHeader('Content-Type', 'text/plain')
21
- res.setHeader('x-my-header', 'hello!')
22
- res.end('hello world')
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
- reply.from()
27
- })
26
+ instance.get('/', (_request, reply) => {
27
+ reply.from()
28
+ })
28
29
 
29
- t.teardown(target.close.bind(target))
30
+ t.after(() => target.close())
30
31
 
31
- target.listen({ port: 0 }, (err) => {
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 }, (err) => {
40
- t.error(err)
39
+ await new Promise(resolve => instance.listen({ port: 0 }, resolve))
41
40
 
42
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
43
- t.error(err)
44
- t.equal(res.headers['content-type'], 'text/plain')
45
- t.equal(res.headers['x-my-header'], 'hello!')
46
- t.equal(res.statusCode, 205)
47
- t.equal(data.toString(), 'hello world')
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('tap')
3
+ const { test } = require('node:test')
4
4
  const Fastify = require('fastify')
5
- const got = require('got')
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.teardown(instance.close.bind(instance))
21
+ t.after(() => instance.close())
22
22
 
23
23
  instance.get('/', (_request, reply) => {
24
- reply.code(201)
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
- try {
34
- await got(`http://localhost:${instance.server.address().port}`)
35
- } catch (err) {
36
- t.equal(err.response.statusCode, 500)
37
- t.match(err.response.headers['content-type'], /application\/json/)
38
- t.same(JSON.parse(err.response.body), {
39
- statusCode: 500,
40
- code: 'FST_REPLY_FROM_INTERNAL_SERVER_ERROR',
41
- error: 'Internal Server Error',
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('tap')
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.plan(4)
20
- t.teardown(instance.close.bind(instance))
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
- fs.unlinkSync(socketPath)
26
- } catch (_) {
27
- }
20
+ try {
21
+ fs.unlinkSync(socketPath)
22
+ } catch (_) {
23
+ }
28
24
 
29
- const target = http.createServer((_req, res) => {
30
- t.fail('no response')
31
- res.end()
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
- reply.from(`unix+http://${querystring.escape(socketPath)}/hello`)
36
- })
30
+ instance.get('/', (_request, reply) => {
31
+ reply.from(`unix+http://${querystring.escape(socketPath)}/hello`)
32
+ })
37
33
 
38
- t.teardown(target.close.bind(target))
34
+ t.after(() => target.close())
39
35
 
40
- instance.listen({ port: 0 }, (err) => {
41
- t.error(err)
36
+ await instance.listen({ port: 0 })
42
37
 
43
- target.listen(socketPath, (err) => {
44
- t.error(err)
38
+ await new Promise(resolve => target.listen(socketPath, resolve))
45
39
 
46
- get(`http://localhost:${instance.server.address().port}`, (err, res) => {
47
- t.error(err)
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('tap')
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.plan(10)
25
- t.teardown(instance.close.bind(instance))
26
-
27
- try {
28
- fs.unlinkSync(socketPath)
29
- } catch (_) {
30
- }
31
-
32
- const target = http.createServer((req, res) => {
33
- t.pass('request proxied')
34
- t.equal(req.method, 'GET')
35
- t.equal(req.url, '/hello')
36
- res.statusCode = 205
37
- res.setHeader('Content-Type', 'text/plain')
38
- res.setHeader('x-my-header', 'hello!')
39
- res.end('hello world')
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
- reply.from('hello')
44
- })
38
+ instance.get('/', (_request, reply) => {
39
+ reply.from('hello')
40
+ })
45
41
 
46
- t.teardown(target.close.bind(target))
42
+ t.after(() => target.close())
47
43
 
48
- instance.listen({ port: 0 }, (err) => {
49
- t.error(err)
44
+ await instance.listen({ port: 0 })
50
45
 
51
- target.listen(socketPath, (err) => {
52
- t.error(err)
46
+ await new Promise(resolve => target.listen(socketPath, resolve))
53
47
 
54
- get(`http://localhost:${instance.server.address().port}`, (err, res, data) => {
55
- t.error(err)
56
- t.equal(res.headers['content-type'], 'text/plain')
57
- t.equal(res.headers['x-my-header'], 'hello!')
58
- t.equal(res.statusCode, 205)
59
- t.equal(data.toString(), 'hello world')
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
  })