undici 5.28.1 → 5.28.2
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/lib/api/api-request.js +1 -0
- package/lib/api/readable.js +1 -1
- package/lib/cache/symbols.js +1 -1
- package/lib/core/symbols.js +2 -1
- package/lib/fetch/dataURL.js +5 -8
- package/lib/fetch/headers.js +4 -1
- package/lib/fetch/index.js +1 -1
- package/lib/fetch/request.js +6 -7
- package/lib/fetch/response.js +3 -7
- package/lib/handler/RetryHandler.js +2 -2
- package/lib/proxy-agent.js +6 -4
- package/package.json +4 -4
- package/types/fetch.d.ts +1 -1
package/lib/api/api-request.js
CHANGED
package/lib/api/readable.js
CHANGED
|
@@ -180,7 +180,7 @@ module.exports = class BodyReadable extends Readable {
|
|
|
180
180
|
this
|
|
181
181
|
.on('close', function () {
|
|
182
182
|
signalListenerCleanup()
|
|
183
|
-
if (signal
|
|
183
|
+
if (signal && signal.aborted) {
|
|
184
184
|
reject(signal.reason || Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))
|
|
185
185
|
} else {
|
|
186
186
|
resolve(null)
|
package/lib/cache/symbols.js
CHANGED
package/lib/core/symbols.js
CHANGED
|
@@ -58,5 +58,6 @@ module.exports = {
|
|
|
58
58
|
kHTTP1BuildRequest: Symbol('http1 build request'),
|
|
59
59
|
kHTTP2CopyHeaders: Symbol('http2 copy headers'),
|
|
60
60
|
kHTTPConnVersion: Symbol('http connection version'),
|
|
61
|
-
kRetryHandlerDefaultRetry: Symbol('retry agent default retry')
|
|
61
|
+
kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
|
|
62
|
+
kConstruct: Symbol('constructable')
|
|
62
63
|
}
|
package/lib/fetch/dataURL.js
CHANGED
|
@@ -119,17 +119,14 @@ function dataURLProcessor (dataURL) {
|
|
|
119
119
|
* @param {boolean} excludeFragment
|
|
120
120
|
*/
|
|
121
121
|
function URLSerializer (url, excludeFragment = false) {
|
|
122
|
-
const href = url.href
|
|
123
|
-
|
|
124
122
|
if (!excludeFragment) {
|
|
125
|
-
return href
|
|
123
|
+
return url.href
|
|
126
124
|
}
|
|
127
125
|
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return href.slice(0, hash)
|
|
126
|
+
const href = url.href
|
|
127
|
+
const hashLength = url.hash.length
|
|
128
|
+
|
|
129
|
+
return hashLength === 0 ? href : href.substring(0, href.length - hashLength)
|
|
133
130
|
}
|
|
134
131
|
|
|
135
132
|
// https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points
|
package/lib/fetch/headers.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
'use strict'
|
|
4
4
|
|
|
5
|
-
const { kHeadersList } = require('../core/symbols')
|
|
5
|
+
const { kHeadersList, kConstruct } = require('../core/symbols')
|
|
6
6
|
const { kGuard } = require('./symbols')
|
|
7
7
|
const { kEnumerableProperty } = require('../core/util')
|
|
8
8
|
const {
|
|
@@ -240,6 +240,9 @@ class HeadersList {
|
|
|
240
240
|
// https://fetch.spec.whatwg.org/#headers-class
|
|
241
241
|
class Headers {
|
|
242
242
|
constructor (init = undefined) {
|
|
243
|
+
if (init === kConstruct) {
|
|
244
|
+
return
|
|
245
|
+
}
|
|
243
246
|
this[kHeadersList] = new HeadersList()
|
|
244
247
|
|
|
245
248
|
// The new Headers(init) constructor steps are:
|
package/lib/fetch/index.js
CHANGED
|
@@ -286,7 +286,7 @@ function finalizeAndReportTiming (response, initiatorType = 'other') {
|
|
|
286
286
|
}
|
|
287
287
|
|
|
288
288
|
// 8. If response’s timing allow passed flag is not set, then:
|
|
289
|
-
if (!
|
|
289
|
+
if (!response.timingAllowPassed) {
|
|
290
290
|
// 1. Set timingInfo to a the result of creating an opaque timing info for timingInfo.
|
|
291
291
|
timingInfo = createOpaqueTimingInfo({
|
|
292
292
|
startTime: timingInfo.startTime
|
package/lib/fetch/request.js
CHANGED
|
@@ -28,13 +28,12 @@ const { kHeaders, kSignal, kState, kGuard, kRealm } = require('./symbols')
|
|
|
28
28
|
const { webidl } = require('./webidl')
|
|
29
29
|
const { getGlobalOrigin } = require('./global')
|
|
30
30
|
const { URLSerializer } = require('./dataURL')
|
|
31
|
-
const { kHeadersList } = require('../core/symbols')
|
|
31
|
+
const { kHeadersList, kConstruct } = require('../core/symbols')
|
|
32
32
|
const assert = require('assert')
|
|
33
33
|
const { getMaxListeners, setMaxListeners, getEventListeners, defaultMaxListeners } = require('events')
|
|
34
34
|
|
|
35
35
|
let TransformStream = globalThis.TransformStream
|
|
36
36
|
|
|
37
|
-
const kInit = Symbol('init')
|
|
38
37
|
const kAbortController = Symbol('abortController')
|
|
39
38
|
|
|
40
39
|
const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
|
|
@@ -45,7 +44,7 @@ const requestFinalizer = new FinalizationRegistry(({ signal, abort }) => {
|
|
|
45
44
|
class Request {
|
|
46
45
|
// https://fetch.spec.whatwg.org/#dom-request
|
|
47
46
|
constructor (input, init = {}) {
|
|
48
|
-
if (input ===
|
|
47
|
+
if (input === kConstruct) {
|
|
49
48
|
return
|
|
50
49
|
}
|
|
51
50
|
|
|
@@ -302,7 +301,7 @@ class Request {
|
|
|
302
301
|
}
|
|
303
302
|
|
|
304
303
|
// 23. If init["integrity"] exists, then set request’s integrity metadata to it.
|
|
305
|
-
if (init.integrity
|
|
304
|
+
if (init.integrity != null) {
|
|
306
305
|
request.integrity = String(init.integrity)
|
|
307
306
|
}
|
|
308
307
|
|
|
@@ -398,7 +397,7 @@ class Request {
|
|
|
398
397
|
// 30. Set this’s headers to a new Headers object with this’s relevant
|
|
399
398
|
// Realm, whose header list is request’s header list and guard is
|
|
400
399
|
// "request".
|
|
401
|
-
this[kHeaders] = new Headers()
|
|
400
|
+
this[kHeaders] = new Headers(kConstruct)
|
|
402
401
|
this[kHeaders][kHeadersList] = request.headersList
|
|
403
402
|
this[kHeaders][kGuard] = 'request'
|
|
404
403
|
this[kHeaders][kRealm] = this[kRealm]
|
|
@@ -725,10 +724,10 @@ class Request {
|
|
|
725
724
|
|
|
726
725
|
// 3. Let clonedRequestObject be the result of creating a Request object,
|
|
727
726
|
// given clonedRequest, this’s headers’s guard, and this’s relevant Realm.
|
|
728
|
-
const clonedRequestObject = new Request(
|
|
727
|
+
const clonedRequestObject = new Request(kConstruct)
|
|
729
728
|
clonedRequestObject[kState] = clonedRequest
|
|
730
729
|
clonedRequestObject[kRealm] = this[kRealm]
|
|
731
|
-
clonedRequestObject[kHeaders] = new Headers()
|
|
730
|
+
clonedRequestObject[kHeaders] = new Headers(kConstruct)
|
|
732
731
|
clonedRequestObject[kHeaders][kHeadersList] = clonedRequest.headersList
|
|
733
732
|
clonedRequestObject[kHeaders][kGuard] = this[kHeaders][kGuard]
|
|
734
733
|
clonedRequestObject[kHeaders][kRealm] = this[kHeaders][kRealm]
|
package/lib/fetch/response.js
CHANGED
|
@@ -23,7 +23,7 @@ const { webidl } = require('./webidl')
|
|
|
23
23
|
const { FormData } = require('./formdata')
|
|
24
24
|
const { getGlobalOrigin } = require('./global')
|
|
25
25
|
const { URLSerializer } = require('./dataURL')
|
|
26
|
-
const { kHeadersList } = require('../core/symbols')
|
|
26
|
+
const { kHeadersList, kConstruct } = require('../core/symbols')
|
|
27
27
|
const assert = require('assert')
|
|
28
28
|
const { types } = require('util')
|
|
29
29
|
|
|
@@ -144,7 +144,7 @@ class Response {
|
|
|
144
144
|
// 2. Set this’s headers to a new Headers object with this’s relevant
|
|
145
145
|
// Realm, whose header list is this’s response’s header list and guard
|
|
146
146
|
// is "response".
|
|
147
|
-
this[kHeaders] = new Headers()
|
|
147
|
+
this[kHeaders] = new Headers(kConstruct)
|
|
148
148
|
this[kHeaders][kGuard] = 'response'
|
|
149
149
|
this[kHeaders][kHeadersList] = this[kState].headersList
|
|
150
150
|
this[kHeaders][kRealm] = this[kRealm]
|
|
@@ -514,11 +514,7 @@ webidl.converters.XMLHttpRequestBodyInit = function (V) {
|
|
|
514
514
|
return webidl.converters.Blob(V, { strict: false })
|
|
515
515
|
}
|
|
516
516
|
|
|
517
|
-
if (
|
|
518
|
-
types.isAnyArrayBuffer(V) ||
|
|
519
|
-
types.isTypedArray(V) ||
|
|
520
|
-
types.isDataView(V)
|
|
521
|
-
) {
|
|
517
|
+
if (types.isArrayBuffer(V) || types.isTypedArray(V) || types.isDataView(V)) {
|
|
522
518
|
return webidl.converters.BufferSource(V)
|
|
523
519
|
}
|
|
524
520
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const assert = require('
|
|
1
|
+
const assert = require('assert')
|
|
2
2
|
|
|
3
3
|
const { kRetryHandlerDefaultRetry } = require('../core/symbols')
|
|
4
4
|
const { RequestRetryError } = require('../core/errors')
|
|
@@ -95,7 +95,7 @@ class RetryHandler {
|
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
onBodySent (chunk) {
|
|
98
|
-
return this.handler.onBodySent(chunk)
|
|
98
|
+
if (this.handler.onBodySent) return this.handler.onBodySent(chunk)
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
static [kRetryHandlerDefaultRetry] (err, { state, opts }, cb) {
|
package/lib/proxy-agent.js
CHANGED
|
@@ -65,6 +65,9 @@ class ProxyAgent extends DispatcherBase {
|
|
|
65
65
|
this[kProxyTls] = opts.proxyTls
|
|
66
66
|
this[kProxyHeaders] = opts.headers || {}
|
|
67
67
|
|
|
68
|
+
const resolvedUrl = new URL(opts.uri)
|
|
69
|
+
const { origin, port, host, username, password } = resolvedUrl
|
|
70
|
+
|
|
68
71
|
if (opts.auth && opts.token) {
|
|
69
72
|
throw new InvalidArgumentError('opts.auth cannot be used in combination with opts.token')
|
|
70
73
|
} else if (opts.auth) {
|
|
@@ -72,11 +75,10 @@ class ProxyAgent extends DispatcherBase {
|
|
|
72
75
|
this[kProxyHeaders]['proxy-authorization'] = `Basic ${opts.auth}`
|
|
73
76
|
} else if (opts.token) {
|
|
74
77
|
this[kProxyHeaders]['proxy-authorization'] = opts.token
|
|
78
|
+
} else if (username && password) {
|
|
79
|
+
this[kProxyHeaders]['proxy-authorization'] = `Basic ${Buffer.from(`${decodeURIComponent(username)}:${decodeURIComponent(password)}`).toString('base64')}`
|
|
75
80
|
}
|
|
76
81
|
|
|
77
|
-
const resolvedUrl = new URL(opts.uri)
|
|
78
|
-
const { origin, port, host } = resolvedUrl
|
|
79
|
-
|
|
80
82
|
const connect = buildConnector({ ...opts.proxyTls })
|
|
81
83
|
this[kConnectEndpoint] = buildConnector({ ...opts.requestTls })
|
|
82
84
|
this[kClient] = clientFactory(resolvedUrl, { connect })
|
|
@@ -100,7 +102,7 @@ class ProxyAgent extends DispatcherBase {
|
|
|
100
102
|
})
|
|
101
103
|
if (statusCode !== 200) {
|
|
102
104
|
socket.on('error', () => {}).destroy()
|
|
103
|
-
callback(new RequestAbortedError(
|
|
105
|
+
callback(new RequestAbortedError(`Proxy response (${statusCode}) !== 200 when HTTP Tunneling`))
|
|
104
106
|
}
|
|
105
107
|
if (opts.protocol !== 'https:') {
|
|
106
108
|
callback(null, socket)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "undici",
|
|
3
|
-
"version": "5.28.
|
|
3
|
+
"version": "5.28.2",
|
|
4
4
|
"description": "An HTTP/1.1 client, written from scratch for Node.js",
|
|
5
5
|
"homepage": "https://undici.nodejs.org",
|
|
6
6
|
"bugs": {
|
|
@@ -110,12 +110,12 @@
|
|
|
110
110
|
"dns-packet": "^5.4.0",
|
|
111
111
|
"docsify-cli": "^4.4.3",
|
|
112
112
|
"form-data": "^4.0.0",
|
|
113
|
-
"formdata-node": "^
|
|
113
|
+
"formdata-node": "^6.0.3",
|
|
114
114
|
"https-pem": "^3.0.0",
|
|
115
115
|
"husky": "^8.0.1",
|
|
116
116
|
"import-fresh": "^3.3.0",
|
|
117
117
|
"jest": "^29.0.2",
|
|
118
|
-
"jsdom": "^
|
|
118
|
+
"jsdom": "^23.0.0",
|
|
119
119
|
"jsfuzz": "^1.0.15",
|
|
120
120
|
"mocha": "^10.0.0",
|
|
121
121
|
"mockttp": "^3.9.2",
|
|
@@ -124,7 +124,7 @@
|
|
|
124
124
|
"proxy": "^1.0.2",
|
|
125
125
|
"proxyquire": "^2.1.3",
|
|
126
126
|
"semver": "^7.5.4",
|
|
127
|
-
"sinon": "^
|
|
127
|
+
"sinon": "^17.0.1",
|
|
128
128
|
"snazzy": "^9.0.0",
|
|
129
129
|
"standard": "^17.0.0",
|
|
130
130
|
"table": "^6.8.0",
|
package/types/fetch.d.ts
CHANGED