@fastify/reply-from 9.4.0 → 9.5.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/.gitattributes +2 -0
- package/README.md +78 -22
- package/index.js +32 -24
- package/lib/request.js +4 -4
- package/lib/utils.js +2 -0
- package/package.json +3 -2
- package/test/async-route-handler.test.js +1 -1
- package/test/base-get.test.js +1 -1
- package/test/base-querystring.test.js +1 -1
- package/test/core-with-path-in-base.test.js +1 -1
- package/test/custom-undici-instance.test.js +1 -1
- package/test/disable-request-logging.test.js +1 -1
- package/test/fastify-multipart-incompatibility.test.js +3 -3
- package/test/full-get-test.test.js +1 -1
- package/test/full-https-get.test.js +3 -3
- package/test/full-post-extended-content-type.test.js +1 -1
- package/test/full-post-stream-core.test.js +1 -1
- package/test/full-post-stream.test.js +1 -1
- package/test/full-post.test.js +1 -1
- package/test/full-querystring-rewrite-option-complex.test.js +1 -1
- package/test/full-querystring-rewrite-option-function.test.js +2 -2
- package/test/full-querystring-rewrite-option.test.js +1 -1
- package/test/full-querystring-rewrite-string.test.js +1 -1
- package/test/full-querystring-rewrite.test.js +1 -1
- package/test/full-querystring.test.js +1 -1
- package/test/full-rewrite-body-content-type.test.js +1 -1
- package/test/full-rewrite-body-http.test.js +1 -1
- package/test/full-rewrite-body-to-empty-string.test.js +1 -1
- package/test/full-rewrite-body-to-null.test.js +1 -1
- package/test/full-rewrite-body.test.js +1 -1
- package/test/get-upstream-http.test.js +1 -1
- package/test/get-upstream-type.test.js +1 -1
- package/test/get-upstream-undici.test.js +1 -1
- package/test/get-with-body.test.js +1 -1
- package/test/head-with-body.test.js +1 -1
- package/test/http-agents.test.js +2 -2
- package/test/http-global-agent.test.js +1 -1
- package/test/http-retry.test.js +1 -1
- package/test/http2-http2.test.js +2 -2
- package/test/http2-https.test.js +2 -2
- package/test/https-agents.test.js +4 -4
- package/test/https-global-agent.test.js +3 -3
- package/test/method.test.js +1 -1
- package/test/modifyCoreObjects-false.test.js +1 -1
- package/test/no-body-opts-with-get.test.js +1 -1
- package/test/no-body-opts-with-head.test.js +1 -1
- package/test/no-stream-body-option.test.js +2 -2
- package/test/onResponse.test.js +1 -1
- package/test/padded-body.test.js +1 -1
- package/test/post-formbody.test.js +1 -1
- package/test/post-plain-text.test.js +1 -1
- package/test/post-with-custom-encoded-contenttype.test.js +2 -2
- package/test/post-with-octet-stream.test.js +2 -2
- package/test/retry-on-503.test.js +1 -1
- package/test/retry-with-a-custom-handler.test.js +162 -0
- package/test/rewrite-headers-type.test.js +1 -1
- package/test/rewrite-headers.test.js +1 -1
- package/test/rewrite-request-headers-type.test.js +1 -1
- package/test/rewrite-request-headers.test.js +1 -1
- package/test/transform-body.test.js +2 -2
- package/test/undici-agent.test.js +1 -1
- package/test/undici-body.test.js +1 -1
- package/test/undici-connect-timeout.test.js +2 -2
- package/test/undici-global-agent.test.js +1 -1
- package/test/undici-options.test.js +1 -1
- package/test/undici-retry.test.js +1 -1
- package/test/undici-timeout-body-partial.test.js +1 -1
- package/test/undici-timeout-body.test.js +1 -1
- package/test/undici-with-path-in-base.test.js +1 -1
- package/test/undici.test.js +1 -1
- package/test/unix-http-undici-from.test.js +3 -3
- package/test/unix-http-undici.test.js +3 -3
- package/test/unix-http.test.js +3 -3
- package/test/unix-https-undici.test.js +4 -4
- package/test/unix-https.test.js +4 -4
- package/types/index.d.ts +24 -15
- package/types/index.test-d.ts +15 -6
package/test/http-agents.test.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
7
|
-
const https = require('https')
|
|
6
|
+
const http = require('node:http')
|
|
7
|
+
const https = require('node:https')
|
|
8
8
|
const get = require('simple-get').concat
|
|
9
9
|
|
|
10
10
|
const instance = Fastify()
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const { test } = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
8
|
|
|
9
9
|
test('http global agent is used, but not destroyed', async (t) => {
|
package/test/http-retry.test.js
CHANGED
package/test/http2-http2.test.js
CHANGED
|
@@ -4,8 +4,8 @@ const h2url = require('h2url')
|
|
|
4
4
|
const t = require('tap')
|
|
5
5
|
const Fastify = require('fastify')
|
|
6
6
|
const From = require('..')
|
|
7
|
-
const fs = require('fs')
|
|
8
|
-
const path = require('path')
|
|
7
|
+
const fs = require('node:fs')
|
|
8
|
+
const path = require('node:path')
|
|
9
9
|
const certs = {
|
|
10
10
|
key: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.key')),
|
|
11
11
|
cert: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.cert'))
|
package/test/http2-https.test.js
CHANGED
|
@@ -5,8 +5,8 @@ const t = require('tap')
|
|
|
5
5
|
const Fastify = require('fastify')
|
|
6
6
|
const From = require('..')
|
|
7
7
|
const got = require('got')
|
|
8
|
-
const fs = require('fs')
|
|
9
|
-
const path = require('path')
|
|
8
|
+
const fs = require('node:fs')
|
|
9
|
+
const path = require('node:path')
|
|
10
10
|
const certs = {
|
|
11
11
|
allowHTTP1: true, // fallback support for HTTP1
|
|
12
12
|
key: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.key')),
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
7
|
-
const https = require('https')
|
|
6
|
+
const http = require('node:http')
|
|
7
|
+
const https = require('node:https')
|
|
8
8
|
const get = require('simple-get').concat
|
|
9
9
|
|
|
10
|
-
const fs = require('fs')
|
|
11
|
-
const path = require('path')
|
|
10
|
+
const fs = require('node:fs')
|
|
11
|
+
const path = require('node:path')
|
|
12
12
|
const certs = {
|
|
13
13
|
key: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.key')),
|
|
14
14
|
cert: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.cert'))
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const { test } = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const https = require('https')
|
|
6
|
+
const https = require('node:https')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
8
|
|
|
9
|
-
const fs = require('fs')
|
|
10
|
-
const path = require('path')
|
|
9
|
+
const fs = require('node:fs')
|
|
10
|
+
const path = require('node:path')
|
|
11
11
|
const certs = {
|
|
12
12
|
key: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.key')),
|
|
13
13
|
cert: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.cert'))
|
package/test/method.test.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
|
-
const Readable = require('stream').Readable
|
|
8
|
+
const Readable = require('node:stream').Readable
|
|
9
9
|
|
|
10
10
|
const instance = Fastify()
|
|
11
11
|
instance.register(From)
|
package/test/onResponse.test.js
CHANGED
package/test/padded-body.test.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
|
-
const { parse } = require('querystring')
|
|
8
|
+
const { parse } = require('node:querystring')
|
|
9
9
|
|
|
10
10
|
const instance = Fastify()
|
|
11
11
|
instance.register(From, {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const test = require('tap').test
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('../index')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
|
-
const { parse } = require('querystring')
|
|
8
|
+
const { parse } = require('node:querystring')
|
|
9
9
|
|
|
10
10
|
test('with explicitly set content-type application/octet-stream', t => {
|
|
11
11
|
const instance = Fastify()
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { test } = require('tap')
|
|
4
|
+
const Fastify = require('fastify')
|
|
5
|
+
const From = require('..')
|
|
6
|
+
const http = require('node:http')
|
|
7
|
+
const got = require('got')
|
|
8
|
+
|
|
9
|
+
function serverWithCustomError (stopAfter, statusCodeToFailOn, closeSocket) {
|
|
10
|
+
let requestCount = 0
|
|
11
|
+
return http.createServer((req, res) => {
|
|
12
|
+
if (requestCount++ < stopAfter) {
|
|
13
|
+
if (closeSocket) req.socket.end()
|
|
14
|
+
res.statusCode = statusCodeToFailOn
|
|
15
|
+
res.setHeader('Content-Type', 'text/plain')
|
|
16
|
+
return res.end('This Service is Unavailable')
|
|
17
|
+
} else {
|
|
18
|
+
res.statusCode = 205
|
|
19
|
+
res.setHeader('Content-Type', 'text/plain')
|
|
20
|
+
return res.end(`Hello World ${requestCount}!`)
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function setupServer (t, fromOptions = {}, statusCodeToFailOn = 500, stopAfter = 4, closeSocket = false) {
|
|
26
|
+
const target = serverWithCustomError(stopAfter, statusCodeToFailOn, closeSocket)
|
|
27
|
+
|
|
28
|
+
await target.listen({ port: 0 })
|
|
29
|
+
t.teardown(target.close.bind(target))
|
|
30
|
+
|
|
31
|
+
const instance = Fastify()
|
|
32
|
+
instance.register(From, {
|
|
33
|
+
base: `http://localhost:${target.address().port}`
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
instance.get('/', (request, reply) => {
|
|
37
|
+
reply.from(`http://localhost:${target.address().port}`, fromOptions)
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
t.teardown(instance.close.bind(instance))
|
|
41
|
+
await instance.listen({ port: 0 })
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
instance
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
test('a 500 status code with no custom handler should fail', async (t) => {
|
|
49
|
+
const { instance } = await setupServer(t)
|
|
50
|
+
|
|
51
|
+
let errorMessage
|
|
52
|
+
try {
|
|
53
|
+
await got.get(`http://localhost:${instance.server.address().port}`, { retry: 3 })
|
|
54
|
+
} catch (error) {
|
|
55
|
+
errorMessage = error.message
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
t.equal(errorMessage, 'Response code 500 (Internal Server Error)')
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
test("a server 500's with a custom handler and should revive", async (t) => {
|
|
62
|
+
const customRetryLogic = ({ req, res, err, attempt, getDefaultDelay }) => {
|
|
63
|
+
const defaultDelay = getDefaultDelay()
|
|
64
|
+
if (defaultDelay) return defaultDelay
|
|
65
|
+
|
|
66
|
+
if (res && res.statusCode === 500 && req.method === 'GET') {
|
|
67
|
+
return 0.1
|
|
68
|
+
}
|
|
69
|
+
return null
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const { instance } = await setupServer(t, { retryDelay: customRetryLogic })
|
|
73
|
+
|
|
74
|
+
const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
|
|
75
|
+
|
|
76
|
+
t.equal(res.headers['content-type'], 'text/plain')
|
|
77
|
+
t.equal(res.statusCode, 205)
|
|
78
|
+
t.equal(res.body.toString(), 'Hello World 5!')
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
test('custom retry does not invoke the default delay causing a 501', async (t) => {
|
|
82
|
+
// the key here is our retryDelay doesn't register the deefault handler and as a result it doesn't work
|
|
83
|
+
const customRetryLogic = ({ req, res, err, attempt, getDefaultDelay }) => {
|
|
84
|
+
if (res && res.statusCode === 500 && req.method === 'GET') {
|
|
85
|
+
return 0
|
|
86
|
+
}
|
|
87
|
+
return null
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 501)
|
|
91
|
+
|
|
92
|
+
let errorMessage
|
|
93
|
+
try {
|
|
94
|
+
await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
|
|
95
|
+
} catch (error) {
|
|
96
|
+
errorMessage = error.message
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
t.equal(errorMessage, 'Response code 501 (Not Implemented)')
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
test('custom retry delay functions can invoke the default delay', async (t) => {
|
|
103
|
+
const customRetryLogic = ({ req, res, err, attempt, getDefaultDelay }) => {
|
|
104
|
+
// registering the default retry logic for non 500 errors if it occurs
|
|
105
|
+
const defaultDelay = getDefaultDelay()
|
|
106
|
+
if (defaultDelay) return defaultDelay
|
|
107
|
+
|
|
108
|
+
if (res && res.statusCode === 500 && req.method === 'GET') {
|
|
109
|
+
return 0.1
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return null
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500)
|
|
116
|
+
|
|
117
|
+
const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
|
|
118
|
+
|
|
119
|
+
t.equal(res.headers['content-type'], 'text/plain')
|
|
120
|
+
t.equal(res.statusCode, 205)
|
|
121
|
+
t.equal(res.body.toString(), 'Hello World 5!')
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
test('custom retry delay function inspects the err paramater', async (t) => {
|
|
125
|
+
const customRetryLogic = ({ req, res, err, attempt, getDefaultDelay }) => {
|
|
126
|
+
if (err && (err.code === 'UND_ERR_SOCKET' || err.code === 'ECONNRESET')) {
|
|
127
|
+
return 0.1
|
|
128
|
+
}
|
|
129
|
+
return null
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500, 4, true)
|
|
133
|
+
|
|
134
|
+
const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
|
|
135
|
+
|
|
136
|
+
t.equal(res.headers['content-type'], 'text/plain')
|
|
137
|
+
t.equal(res.statusCode, 205)
|
|
138
|
+
t.equal(res.body.toString(), 'Hello World 5!')
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
test('we can exceed our retryCount and introspect attempts independently', async (t) => {
|
|
142
|
+
const attemptCounter = []
|
|
143
|
+
|
|
144
|
+
const customRetryLogic = ({ req, res, err, attempt, getDefaultDelay }) => {
|
|
145
|
+
attemptCounter.push(attempt)
|
|
146
|
+
|
|
147
|
+
if (err && (err.code === 'UND_ERR_SOCKET' || err.code === 'ECONNRESET')) {
|
|
148
|
+
return 0.1
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return null
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const { instance } = await setupServer(t, { retryDelay: customRetryLogic }, 500, 4, true)
|
|
155
|
+
|
|
156
|
+
const res = await got.get(`http://localhost:${instance.server.address().port}`, { retry: 5 })
|
|
157
|
+
|
|
158
|
+
t.match(attemptCounter, [0, 1, 2, 3, 4])
|
|
159
|
+
t.equal(res.headers['content-type'], 'text/plain')
|
|
160
|
+
t.equal(res.statusCode, 205)
|
|
161
|
+
t.equal(res.body.toString(), 'Hello World 5!')
|
|
162
|
+
})
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
|
-
const Transform = require('stream').Transform
|
|
8
|
+
const Transform = require('node:stream').Transform
|
|
9
9
|
|
|
10
10
|
const instance = Fastify()
|
|
11
11
|
instance.register(From)
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const proxyquire = require('proxyquire')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
8
|
const undici = require('undici')
|
|
9
9
|
const { getUndiciOptions } = require('../lib/request')
|
package/test/undici-body.test.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const t = require('tap')
|
|
4
|
-
const http = require('http')
|
|
5
|
-
const net = require('net')
|
|
4
|
+
const http = require('node:http')
|
|
5
|
+
const net = require('node:net')
|
|
6
6
|
const Fastify = require('fastify')
|
|
7
7
|
const From = require('..')
|
|
8
8
|
const got = require('got')
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const proxyquire = require('proxyquire')
|
|
6
|
-
const http = require('http')
|
|
6
|
+
const http = require('node:http')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
8
|
const undici = require('undici')
|
|
9
9
|
const { getUndiciOptions } = require('../lib/request')
|
package/test/undici.test.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const fs = require('fs')
|
|
7
|
-
const querystring = require('querystring')
|
|
8
|
-
const http = require('http')
|
|
6
|
+
const fs = require('node:fs')
|
|
7
|
+
const querystring = require('node:querystring')
|
|
8
|
+
const http = require('node:http')
|
|
9
9
|
const get = require('simple-get').concat
|
|
10
10
|
|
|
11
11
|
if (process.platform === 'win32') {
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const fs = require('fs')
|
|
7
|
-
const querystring = require('querystring')
|
|
8
|
-
const http = require('http')
|
|
6
|
+
const fs = require('node:fs')
|
|
7
|
+
const querystring = require('node:querystring')
|
|
8
|
+
const http = require('node:http')
|
|
9
9
|
const get = require('simple-get').concat
|
|
10
10
|
|
|
11
11
|
if (process.platform === 'win32') {
|
package/test/unix-http.test.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const fs = require('fs')
|
|
7
|
-
const querystring = require('querystring')
|
|
8
|
-
const http = require('http')
|
|
6
|
+
const fs = require('node:fs')
|
|
7
|
+
const querystring = require('node:querystring')
|
|
8
|
+
const http = require('node:http')
|
|
9
9
|
const get = require('simple-get').concat
|
|
10
10
|
|
|
11
11
|
if (process.platform === 'win32') {
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
const t = require('tap')
|
|
4
4
|
const Fastify = require('fastify')
|
|
5
5
|
const From = require('..')
|
|
6
|
-
const https = require('https')
|
|
6
|
+
const https = require('node:https')
|
|
7
7
|
const get = require('simple-get').concat
|
|
8
|
-
const fs = require('fs')
|
|
9
|
-
const querystring = require('querystring')
|
|
10
|
-
const path = require('path')
|
|
8
|
+
const fs = require('node:fs')
|
|
9
|
+
const querystring = require('node:querystring')
|
|
10
|
+
const path = require('node:path')
|
|
11
11
|
const certs = {
|
|
12
12
|
key: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.key')),
|
|
13
13
|
cert: fs.readFileSync(path.join(__dirname, 'fixtures', 'fastify.cert'))
|