deps: update undici to 5.27.0

PR-URL: https://github.com/nodejs/node/pull/50463
Reviewed-By: Matthew Aitken <maitken033380023@gmail.com>
Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
This commit is contained in:
Node.js GitHub Bot 2023-10-31 00:32:08 +00:00 committed by GitHub
parent a913b8742f
commit aa4248dc84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 251 additions and 183 deletions

View File

@ -2,13 +2,11 @@
const fetchImpl = require('./lib/fetch').fetch const fetchImpl = require('./lib/fetch').fetch
module.exports.fetch = async function fetch (resource, init = undefined) { module.exports.fetch = function fetch (resource, init = undefined) {
try { return fetchImpl(resource, init).catch((err) => {
return await fetchImpl(resource, init)
} catch (err) {
Error.captureStackTrace(err, this) Error.captureStackTrace(err, this)
throw err throw err
} })
} }
module.exports.FormData = require('./lib/fetch/formdata').FormData module.exports.FormData = require('./lib/fetch/formdata').FormData
module.exports.Headers = require('./lib/fetch/headers').Headers module.exports.Headers = require('./lib/fetch/headers').Headers

View File

@ -222,6 +222,14 @@ class Request {
if (channels.bodySent.hasSubscribers) { if (channels.bodySent.hasSubscribers) {
channels.bodySent.publish({ request: this }) channels.bodySent.publish({ request: this })
} }
if (this[kHandler].onRequestSent) {
try {
this[kHandler].onRequestSent()
} catch (err) {
this.onError(err)
}
}
} }
onConnect (abort) { onConnect (abort) {

View File

@ -26,6 +26,8 @@ let ReadableStream = globalThis.ReadableStream
/** @type {globalThis['File']} */ /** @type {globalThis['File']} */
const File = NativeFile ?? UndiciFile const File = NativeFile ?? UndiciFile
const textEncoder = new TextEncoder()
const textDecoder = new TextDecoder()
// https://fetch.spec.whatwg.org/#concept-bodyinit-extract // https://fetch.spec.whatwg.org/#concept-bodyinit-extract
function extractBody (object, keepalive = false) { function extractBody (object, keepalive = false) {
@ -49,7 +51,7 @@ function extractBody (object, keepalive = false) {
stream = new ReadableStream({ stream = new ReadableStream({
async pull (controller) { async pull (controller) {
controller.enqueue( controller.enqueue(
typeof source === 'string' ? new TextEncoder().encode(source) : source typeof source === 'string' ? textEncoder.encode(source) : source
) )
queueMicrotask(() => readableStreamClose(controller)) queueMicrotask(() => readableStreamClose(controller))
}, },
@ -119,7 +121,6 @@ function extractBody (object, keepalive = false) {
// - That the content-length is calculated in advance. // - That the content-length is calculated in advance.
// - And that all parts are pre-encoded and ready to be sent. // - And that all parts are pre-encoded and ready to be sent.
const enc = new TextEncoder()
const blobParts = [] const blobParts = []
const rn = new Uint8Array([13, 10]) // '\r\n' const rn = new Uint8Array([13, 10]) // '\r\n'
length = 0 length = 0
@ -127,13 +128,13 @@ function extractBody (object, keepalive = false) {
for (const [name, value] of object) { for (const [name, value] of object) {
if (typeof value === 'string') { if (typeof value === 'string') {
const chunk = enc.encode(prefix + const chunk = textEncoder.encode(prefix +
`; name="${escape(normalizeLinefeeds(name))}"` + `; name="${escape(normalizeLinefeeds(name))}"` +
`\r\n\r\n${normalizeLinefeeds(value)}\r\n`) `\r\n\r\n${normalizeLinefeeds(value)}\r\n`)
blobParts.push(chunk) blobParts.push(chunk)
length += chunk.byteLength length += chunk.byteLength
} else { } else {
const chunk = enc.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + const chunk = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` +
(value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' + (value.name ? `; filename="${escape(value.name)}"` : '') + '\r\n' +
`Content-Type: ${ `Content-Type: ${
value.type || 'application/octet-stream' value.type || 'application/octet-stream'
@ -147,7 +148,7 @@ function extractBody (object, keepalive = false) {
} }
} }
const chunk = enc.encode(`--${boundary}--`) const chunk = textEncoder.encode(`--${boundary}--`)
blobParts.push(chunk) blobParts.push(chunk)
length += chunk.byteLength length += chunk.byteLength
if (hasUnknownSizeValue) { if (hasUnknownSizeValue) {
@ -443,14 +444,16 @@ function bodyMixinMethods (instance) {
let text = '' let text = ''
// application/x-www-form-urlencoded parser will keep the BOM. // application/x-www-form-urlencoded parser will keep the BOM.
// https://url.spec.whatwg.org/#concept-urlencoded-parser // https://url.spec.whatwg.org/#concept-urlencoded-parser
const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true }) // Note that streaming decoder is stateful and cannot be reused
const streamingDecoder = new TextDecoder('utf-8', { ignoreBOM: true })
for await (const chunk of consumeBody(this[kState].body)) { for await (const chunk of consumeBody(this[kState].body)) {
if (!isUint8Array(chunk)) { if (!isUint8Array(chunk)) {
throw new TypeError('Expected Uint8Array chunk') throw new TypeError('Expected Uint8Array chunk')
} }
text += textDecoder.decode(chunk, { stream: true }) text += streamingDecoder.decode(chunk, { stream: true })
} }
text += textDecoder.decode() text += streamingDecoder.decode()
entries = new URLSearchParams(text) entries = new URLSearchParams(text)
} catch (err) { } catch (err) {
// istanbul ignore next: Unclear when new URLSearchParams can fail on a string. // istanbul ignore next: Unclear when new URLSearchParams can fail on a string.
@ -565,7 +568,7 @@ function utf8DecodeBytes (buffer) {
// 3. Process a queue with an instance of UTF-8s // 3. Process a queue with an instance of UTF-8s
// decoder, ioQueue, output, and "replacement". // decoder, ioQueue, output, and "replacement".
const output = new TextDecoder().decode(buffer) const output = textDecoder.decode(buffer)
// 4. Return output. // 4. Return output.
return output return output

View File

@ -3,10 +3,12 @@
const { MessageChannel, receiveMessageOnPort } = require('worker_threads') const { MessageChannel, receiveMessageOnPort } = require('worker_threads')
const corsSafeListedMethods = ['GET', 'HEAD', 'POST'] const corsSafeListedMethods = ['GET', 'HEAD', 'POST']
const corsSafeListedMethodsSet = new Set(corsSafeListedMethods)
const nullBodyStatus = [101, 204, 205, 304] const nullBodyStatus = [101, 204, 205, 304]
const redirectStatus = [301, 302, 303, 307, 308] const redirectStatus = [301, 302, 303, 307, 308]
const redirectStatusSet = new Set(redirectStatus)
// https://fetch.spec.whatwg.org/#block-bad-port // https://fetch.spec.whatwg.org/#block-bad-port
const badPorts = [ const badPorts = [
@ -18,6 +20,8 @@ const badPorts = [
'10080' '10080'
] ]
const badPortsSet = new Set(badPorts)
// https://w3c.github.io/webappsec-referrer-policy/#referrer-policies // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies
const referrerPolicy = [ const referrerPolicy = [
'', '',
@ -30,10 +34,12 @@ const referrerPolicy = [
'strict-origin-when-cross-origin', 'strict-origin-when-cross-origin',
'unsafe-url' 'unsafe-url'
] ]
const referrerPolicySet = new Set(referrerPolicy)
const requestRedirect = ['follow', 'manual', 'error'] const requestRedirect = ['follow', 'manual', 'error']
const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE'] const safeMethods = ['GET', 'HEAD', 'OPTIONS', 'TRACE']
const safeMethodsSet = new Set(safeMethods)
const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors'] const requestMode = ['navigate', 'same-origin', 'no-cors', 'cors']
@ -68,6 +74,7 @@ const requestDuplex = [
// http://fetch.spec.whatwg.org/#forbidden-method // http://fetch.spec.whatwg.org/#forbidden-method
const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK'] const forbiddenMethods = ['CONNECT', 'TRACE', 'TRACK']
const forbiddenMethodsSet = new Set(forbiddenMethods)
const subresource = [ const subresource = [
'audio', 'audio',
@ -83,6 +90,7 @@ const subresource = [
'xslt', 'xslt',
'' ''
] ]
const subresourceSet = new Set(subresource)
/** @type {globalThis['DOMException']} */ /** @type {globalThis['DOMException']} */
const DOMException = globalThis.DOMException ?? (() => { const DOMException = globalThis.DOMException ?? (() => {
@ -132,5 +140,12 @@ module.exports = {
nullBodyStatus, nullBodyStatus,
safeMethods, safeMethods,
badPorts, badPorts,
requestDuplex requestDuplex,
subresourceSet,
badPortsSet,
redirectStatusSet,
corsSafeListedMethodsSet,
safeMethodsSet,
forbiddenMethodsSet,
referrerPolicySet
} }

View File

@ -7,6 +7,7 @@ const { isBlobLike } = require('./util')
const { webidl } = require('./webidl') const { webidl } = require('./webidl')
const { parseMIMEType, serializeAMimeType } = require('./dataURL') const { parseMIMEType, serializeAMimeType } = require('./dataURL')
const { kEnumerableProperty } = require('../core/util') const { kEnumerableProperty } = require('../core/util')
const encoder = new TextEncoder()
class File extends Blob { class File extends Blob {
constructor (fileBits, fileName, options = {}) { constructor (fileBits, fileName, options = {}) {
@ -280,7 +281,7 @@ function processBlobParts (parts, options) {
} }
// 3. Append the result of UTF-8 encoding s to bytes. // 3. Append the result of UTF-8 encoding s to bytes.
bytes.push(new TextEncoder().encode(s)) bytes.push(encoder.encode(s))
} else if ( } else if (
types.isAnyArrayBuffer(element) || types.isAnyArrayBuffer(element) ||
types.isTypedArray(element) types.isTypedArray(element)

View File

@ -46,11 +46,11 @@ const { kState, kHeaders, kGuard, kRealm } = require('./symbols')
const assert = require('assert') const assert = require('assert')
const { safelyExtractBody } = require('./body') const { safelyExtractBody } = require('./body')
const { const {
redirectStatus, redirectStatusSet,
nullBodyStatus, nullBodyStatus,
safeMethods, safeMethodsSet,
requestBodyHeader, requestBodyHeader,
subresource, subresourceSet,
DOMException DOMException
} = require('./constants') } = require('./constants')
const { kHeadersList } = require('../core/symbols') const { kHeadersList } = require('../core/symbols')
@ -62,6 +62,7 @@ const { TransformStream } = require('stream/web')
const { getGlobalDispatcher } = require('../global') const { getGlobalDispatcher } = require('../global')
const { webidl } = require('./webidl') const { webidl } = require('./webidl')
const { STATUS_CODES } = require('http') const { STATUS_CODES } = require('http')
const GET_OR_HEAD = ['GET', 'HEAD']
/** @type {import('buffer').resolveObjectURL} */ /** @type {import('buffer').resolveObjectURL} */
let resolveObjectURL let resolveObjectURL
@ -121,7 +122,7 @@ class Fetch extends EE {
} }
// https://fetch.spec.whatwg.org/#fetch-method // https://fetch.spec.whatwg.org/#fetch-method
async function fetch (input, init = {}) { function fetch (input, init = {}) {
webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' }) webidl.argumentLengthCheck(arguments, 1, { header: 'globalThis.fetch' })
// 1. Let p be a new promise. // 1. Let p be a new promise.
@ -204,7 +205,7 @@ async function fetch (input, init = {}) {
const processResponse = (response) => { const processResponse = (response) => {
// 1. If locallyAborted is true, terminate these substeps. // 1. If locallyAborted is true, terminate these substeps.
if (locallyAborted) { if (locallyAborted) {
return return Promise.resolve()
} }
// 2. If responses aborted flag is set, then: // 2. If responses aborted flag is set, then:
@ -217,7 +218,7 @@ async function fetch (input, init = {}) {
// deserializedError. // deserializedError.
abortFetch(p, request, responseObject, controller.serializedAbortReason) abortFetch(p, request, responseObject, controller.serializedAbortReason)
return return Promise.resolve()
} }
// 3. If response is a network error, then reject p with a TypeError // 3. If response is a network error, then reject p with a TypeError
@ -226,7 +227,7 @@ async function fetch (input, init = {}) {
p.reject( p.reject(
Object.assign(new TypeError('fetch failed'), { cause: response.error }) Object.assign(new TypeError('fetch failed'), { cause: response.error })
) )
return return Promise.resolve()
} }
// 4. Set responseObject to the result of creating a Response object, // 4. Set responseObject to the result of creating a Response object,
@ -509,7 +510,7 @@ function fetching ({
} }
// 15. If request is a subresource request, then: // 15. If request is a subresource request, then:
if (subresource.includes(request.destination)) { if (subresourceSet.has(request.destination)) {
// TODO // TODO
} }
@ -776,13 +777,13 @@ async function mainFetch (fetchParams, recursive = false) {
// https://fetch.spec.whatwg.org/#concept-scheme-fetch // https://fetch.spec.whatwg.org/#concept-scheme-fetch
// given a fetch params fetchParams // given a fetch params fetchParams
async function schemeFetch (fetchParams) { function schemeFetch (fetchParams) {
// Note: since the connection is destroyed on redirect, which sets fetchParams to a // Note: since the connection is destroyed on redirect, which sets fetchParams to a
// cancelled state, we do not want this condition to trigger *unless* there have been // cancelled state, we do not want this condition to trigger *unless* there have been
// no redirects. See https://github.com/nodejs/undici/issues/1776 // no redirects. See https://github.com/nodejs/undici/issues/1776
// 1. If fetchParams is canceled, then return the appropriate network error for fetchParams. // 1. If fetchParams is canceled, then return the appropriate network error for fetchParams.
if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
return makeAppropriateNetworkError(fetchParams) return Promise.resolve(makeAppropriateNetworkError(fetchParams))
} }
// 2. Let request be fetchParamss request. // 2. Let request be fetchParamss request.
@ -798,7 +799,7 @@ async function schemeFetch (fetchParams) {
// and body is the empty byte sequence as a body. // and body is the empty byte sequence as a body.
// Otherwise, return a network error. // Otherwise, return a network error.
return makeNetworkError('about scheme is not supported') return Promise.resolve(makeNetworkError('about scheme is not supported'))
} }
case 'blob:': { case 'blob:': {
if (!resolveObjectURL) { if (!resolveObjectURL) {
@ -811,7 +812,7 @@ async function schemeFetch (fetchParams) {
// https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56 // https://github.com/web-platform-tests/wpt/blob/7b0ebaccc62b566a1965396e5be7bb2bc06f841f/FileAPI/url/resources/fetch-tests.js#L52-L56
// Buffer.resolveObjectURL does not ignore URL queries. // Buffer.resolveObjectURL does not ignore URL queries.
if (blobURLEntry.search.length !== 0) { if (blobURLEntry.search.length !== 0) {
return makeNetworkError('NetworkError when attempting to fetch resource.') return Promise.resolve(makeNetworkError('NetworkError when attempting to fetch resource.'))
} }
const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()) const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString())
@ -819,7 +820,7 @@ async function schemeFetch (fetchParams) {
// 2. If requests method is not `GET`, blobURLEntry is null, or blobURLEntrys // 2. If requests method is not `GET`, blobURLEntry is null, or blobURLEntrys
// object is not a Blob object, then return a network error. // object is not a Blob object, then return a network error.
if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) { if (request.method !== 'GET' || !isBlobLike(blobURLEntryObject)) {
return makeNetworkError('invalid method') return Promise.resolve(makeNetworkError('invalid method'))
} }
// 3. Let bodyWithType be the result of safely extracting blobURLEntrys object. // 3. Let bodyWithType be the result of safely extracting blobURLEntrys object.
@ -846,7 +847,7 @@ async function schemeFetch (fetchParams) {
response.body = body response.body = body
return response return Promise.resolve(response)
} }
case 'data:': { case 'data:': {
// 1. Let dataURLStruct be the result of running the // 1. Let dataURLStruct be the result of running the
@ -857,7 +858,7 @@ async function schemeFetch (fetchParams) {
// 2. If dataURLStruct is failure, then return a // 2. If dataURLStruct is failure, then return a
// network error. // network error.
if (dataURLStruct === 'failure') { if (dataURLStruct === 'failure') {
return makeNetworkError('failed to fetch the data URL') return Promise.resolve(makeNetworkError('failed to fetch the data URL'))
} }
// 3. Let mimeType be dataURLStructs MIME type, serialized. // 3. Let mimeType be dataURLStructs MIME type, serialized.
@ -866,28 +867,28 @@ async function schemeFetch (fetchParams) {
// 4. Return a response whose status message is `OK`, // 4. Return a response whose status message is `OK`,
// header list is « (`Content-Type`, mimeType) », // header list is « (`Content-Type`, mimeType) »,
// and body is dataURLStructs body as a body. // and body is dataURLStructs body as a body.
return makeResponse({ return Promise.resolve(makeResponse({
statusText: 'OK', statusText: 'OK',
headersList: [ headersList: [
['content-type', { name: 'Content-Type', value: mimeType }] ['content-type', { name: 'Content-Type', value: mimeType }]
], ],
body: safelyExtractBody(dataURLStruct.body)[0] body: safelyExtractBody(dataURLStruct.body)[0]
}) }))
} }
case 'file:': { case 'file:': {
// For now, unfortunate as it is, file URLs are left as an exercise for the reader. // For now, unfortunate as it is, file URLs are left as an exercise for the reader.
// When in doubt, return a network error. // When in doubt, return a network error.
return makeNetworkError('not implemented... yet...') return Promise.resolve(makeNetworkError('not implemented... yet...'))
} }
case 'http:': case 'http:':
case 'https:': { case 'https:': {
// Return the result of running HTTP fetch given fetchParams. // Return the result of running HTTP fetch given fetchParams.
return await httpFetch(fetchParams) return httpFetch(fetchParams)
.catch((err) => makeNetworkError(err)) .catch((err) => makeNetworkError(err))
} }
default: { default: {
return makeNetworkError('unknown scheme') return Promise.resolve(makeNetworkError('unknown scheme'))
} }
} }
} }
@ -906,7 +907,7 @@ function finalizeResponse (fetchParams, response) {
} }
// https://fetch.spec.whatwg.org/#fetch-finale // https://fetch.spec.whatwg.org/#fetch-finale
async function fetchFinale (fetchParams, response) { function fetchFinale (fetchParams, response) {
// 1. If response is a network error, then: // 1. If response is a network error, then:
if (response.type === 'error') { if (response.type === 'error') {
// 1. Set responses URL list to « fetchParamss requests URL list[0] ». // 1. Set responses URL list to « fetchParamss requests URL list[0] ».
@ -990,8 +991,9 @@ async function fetchFinale (fetchParams, response) {
} else { } else {
// 4. Otherwise, fully read responses body given processBody, processBodyError, // 4. Otherwise, fully read responses body given processBody, processBodyError,
// and fetchParamss task destination. // and fetchParamss task destination.
await fullyReadBody(response.body, processBody, processBodyError) return fullyReadBody(response.body, processBody, processBodyError)
} }
return Promise.resolve()
} }
} }
@ -1062,7 +1064,7 @@ async function httpFetch (fetchParams) {
} }
// 8. If actualResponses status is a redirect status, then: // 8. If actualResponses status is a redirect status, then:
if (redirectStatus.includes(actualResponse.status)) { if (redirectStatusSet.has(actualResponse.status)) {
// 1. If actualResponses status is not 303, requests body is not null, // 1. If actualResponses status is not 303, requests body is not null,
// and the connection uses HTTP/2, then user agents may, and are even // and the connection uses HTTP/2, then user agents may, and are even
// encouraged to, transmit an RST_STREAM frame. // encouraged to, transmit an RST_STREAM frame.
@ -1099,7 +1101,7 @@ async function httpFetch (fetchParams) {
} }
// https://fetch.spec.whatwg.org/#http-redirect-fetch // https://fetch.spec.whatwg.org/#http-redirect-fetch
async function httpRedirectFetch (fetchParams, response) { function httpRedirectFetch (fetchParams, response) {
// 1. Let request be fetchParamss request. // 1. Let request be fetchParamss request.
const request = fetchParams.request const request = fetchParams.request
@ -1125,18 +1127,18 @@ async function httpRedirectFetch (fetchParams, response) {
} }
} catch (err) { } catch (err) {
// 5. If locationURL is failure, then return a network error. // 5. If locationURL is failure, then return a network error.
return makeNetworkError(err) return Promise.resolve(makeNetworkError(err))
} }
// 6. If locationURLs scheme is not an HTTP(S) scheme, then return a network // 6. If locationURLs scheme is not an HTTP(S) scheme, then return a network
// error. // error.
if (!urlIsHttpHttpsScheme(locationURL)) { if (!urlIsHttpHttpsScheme(locationURL)) {
return makeNetworkError('URL scheme must be a HTTP(S) scheme') return Promise.resolve(makeNetworkError('URL scheme must be a HTTP(S) scheme'))
} }
// 7. If requests redirect count is 20, then return a network error. // 7. If requests redirect count is 20, then return a network error.
if (request.redirectCount === 20) { if (request.redirectCount === 20) {
return makeNetworkError('redirect count exceeded') return Promise.resolve(makeNetworkError('redirect count exceeded'))
} }
// 8. Increase requests redirect count by 1. // 8. Increase requests redirect count by 1.
@ -1150,7 +1152,7 @@ async function httpRedirectFetch (fetchParams, response) {
(locationURL.username || locationURL.password) && (locationURL.username || locationURL.password) &&
!sameOrigin(request, locationURL) !sameOrigin(request, locationURL)
) { ) {
return makeNetworkError('cross origin not allowed for request mode "cors"') return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'))
} }
// 10. If requests response tainting is "cors" and locationURL includes // 10. If requests response tainting is "cors" and locationURL includes
@ -1159,9 +1161,9 @@ async function httpRedirectFetch (fetchParams, response) {
request.responseTainting === 'cors' && request.responseTainting === 'cors' &&
(locationURL.username || locationURL.password) (locationURL.username || locationURL.password)
) { ) {
return makeNetworkError( return Promise.resolve(makeNetworkError(
'URL cannot contain credentials for request mode "cors"' 'URL cannot contain credentials for request mode "cors"'
) ))
} }
// 11. If actualResponses status is not 303, requests body is non-null, // 11. If actualResponses status is not 303, requests body is non-null,
@ -1171,7 +1173,7 @@ async function httpRedirectFetch (fetchParams, response) {
request.body != null && request.body != null &&
request.body.source == null request.body.source == null
) { ) {
return makeNetworkError() return Promise.resolve(makeNetworkError())
} }
// 12. If one of the following is true // 12. If one of the following is true
@ -1180,7 +1182,7 @@ async function httpRedirectFetch (fetchParams, response) {
if ( if (
([301, 302].includes(actualResponse.status) && request.method === 'POST') || ([301, 302].includes(actualResponse.status) && request.method === 'POST') ||
(actualResponse.status === 303 && (actualResponse.status === 303 &&
!['GET', 'HEAD'].includes(request.method)) !GET_OR_HEAD.includes(request.method))
) { ) {
// then: // then:
// 1. Set requests method to `GET` and requests body to null. // 1. Set requests method to `GET` and requests body to null.
@ -1464,7 +1466,7 @@ async function httpNetworkOrCacheFetch (
// responses in httpCache, as per the "Invalidation" chapter of HTTP // responses in httpCache, as per the "Invalidation" chapter of HTTP
// Caching, and set storedResponse to null. [HTTP-CACHING] // Caching, and set storedResponse to null. [HTTP-CACHING]
if ( if (
!safeMethods.includes(httpRequest.method) && !safeMethodsSet.has(httpRequest.method) &&
forwardResponse.status >= 200 && forwardResponse.status >= 200 &&
forwardResponse.status <= 399 forwardResponse.status <= 399
) { ) {
@ -2024,7 +2026,7 @@ async function httpNetworkFetch (
const willFollow = request.redirect === 'follow' && const willFollow = request.redirect === 'follow' &&
location && location &&
redirectStatus.includes(status) redirectStatusSet.has(status)
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding // https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding
if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) { if (request.method !== 'HEAD' && request.method !== 'CONNECT' && !nullBodyStatus.includes(status) && !willFollow) {

View File

@ -13,8 +13,8 @@ const {
makePolicyContainer makePolicyContainer
} = require('./util') } = require('./util')
const { const {
forbiddenMethods, forbiddenMethodsSet,
corsSafeListedMethods, corsSafeListedMethodsSet,
referrerPolicy, referrerPolicy,
requestRedirect, requestRedirect,
requestMode, requestMode,
@ -319,7 +319,7 @@ class Request {
throw TypeError(`'${init.method}' is not a valid HTTP method.`) throw TypeError(`'${init.method}' is not a valid HTTP method.`)
} }
if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { if (forbiddenMethodsSet.has(method.toUpperCase())) {
throw TypeError(`'${init.method}' HTTP method is unsupported.`) throw TypeError(`'${init.method}' HTTP method is unsupported.`)
} }
@ -404,7 +404,7 @@ class Request {
if (mode === 'no-cors') { if (mode === 'no-cors') {
// 1. If thiss requests method is not a CORS-safelisted method, // 1. If thiss requests method is not a CORS-safelisted method,
// then throw a TypeError. // then throw a TypeError.
if (!corsSafeListedMethods.includes(request.method)) { if (!corsSafeListedMethodsSet.has(request.method)) {
throw new TypeError( throw new TypeError(
`'${request.method} is unsupported in no-cors mode.` `'${request.method} is unsupported in no-cors mode.`
) )

View File

@ -14,7 +14,7 @@ const {
isomorphicEncode isomorphicEncode
} = require('./util') } = require('./util')
const { const {
redirectStatus, redirectStatusSet,
nullBodyStatus, nullBodyStatus,
DOMException DOMException
} = require('./constants') } = require('./constants')
@ -28,6 +28,7 @@ const assert = require('assert')
const { types } = require('util') const { types } = require('util')
const ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream const ReadableStream = globalThis.ReadableStream || require('stream/web').ReadableStream
const textEncoder = new TextEncoder('utf-8')
// https://fetch.spec.whatwg.org/#response-class // https://fetch.spec.whatwg.org/#response-class
class Response { class Response {
@ -57,7 +58,7 @@ class Response {
} }
// 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data. // 1. Let bytes the result of running serialize a JavaScript value to JSON bytes on data.
const bytes = new TextEncoder('utf-8').encode( const bytes = textEncoder.encode(
serializeJavascriptValueToJSONString(data) serializeJavascriptValueToJSONString(data)
) )
@ -102,7 +103,7 @@ class Response {
} }
// 3. If status is not a redirect status, then throw a RangeError. // 3. If status is not a redirect status, then throw a RangeError.
if (!redirectStatus.includes(status)) { if (!redirectStatusSet.has(status)) {
throw new RangeError('Invalid status code ' + status) throw new RangeError('Invalid status code ' + status)
} }

View File

@ -1,6 +1,6 @@
'use strict' 'use strict'
const { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require('./constants') const { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require('./constants')
const { getGlobalOrigin } = require('./global') const { getGlobalOrigin } = require('./global')
const { performance } = require('perf_hooks') const { performance } = require('perf_hooks')
const { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util') const { isBlobLike, toUSVString, ReadableStreamFrom } = require('../core/util')
@ -29,7 +29,7 @@ function responseURL (response) {
// https://fetch.spec.whatwg.org/#concept-response-location-url // https://fetch.spec.whatwg.org/#concept-response-location-url
function responseLocationURL (response, requestFragment) { function responseLocationURL (response, requestFragment) {
// 1. If responses status is not a redirect status, then return null. // 1. If responses status is not a redirect status, then return null.
if (!redirectStatus.includes(response.status)) { if (!redirectStatusSet.has(response.status)) {
return null return null
} }
@ -64,7 +64,7 @@ function requestBadPort (request) {
// 2. If urls scheme is an HTTP(S) scheme and urls port is a bad port, // 2. If urls scheme is an HTTP(S) scheme and urls port is a bad port,
// then return blocked. // then return blocked.
if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) { if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
return 'blocked' return 'blocked'
} }
@ -206,7 +206,7 @@ function setRequestReferrerPolicyOnRedirect (request, actualResponse) {
// The left-most policy is the fallback. // The left-most policy is the fallback.
for (let i = policyHeader.length; i !== 0; i--) { for (let i = policyHeader.length; i !== 0; i--) {
const token = policyHeader[i - 1].trim() const token = policyHeader[i - 1].trim()
if (referrerPolicyTokens.includes(token)) { if (referrerPolicyTokens.has(token)) {
policy = token policy = token
break break
} }

120
deps/undici/src/package-lock.json generated vendored
View File

@ -1,12 +1,12 @@
{ {
"name": "undici", "name": "undici",
"version": "5.26.4", "version": "5.27.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "undici", "name": "undici",
"version": "5.26.4", "version": "5.27.0",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@fastify/busboy": "^2.0.0" "@fastify/busboy": "^2.0.0"
@ -795,9 +795,9 @@
} }
}, },
"node_modules/@eslint-community/regexpp": { "node_modules/@eslint-community/regexpp": {
"version": "4.9.1", "version": "4.10.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
"integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0" "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
@ -1634,10 +1634,22 @@
"dev": true "dev": true
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "18.18.6", "version": "18.18.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.6.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.7.tgz",
"integrity": "sha512-wf3Vz+jCmOQ2HV1YUJuCWdL64adYxumkrxtc+H1VUQlnQI04+5HtH+qZCOE21lBE7gIrt+CwX2Wv8Acrw5Ak6w==", "integrity": "sha512-bw+lEsxis6eqJYW8Ql6+yTqkE6RuFtsQPSe5JxXbqYRFQEER5aJA9a5UH9igqDWm3X4iLHIKOHlnAXLM4mi7uQ==",
"dev": true "dev": true,
"dependencies": {
"undici-types": "~5.26.4"
}
},
"node_modules/@types/node-forge": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.8.tgz",
"integrity": "sha512-vGXshY9vim9CJjrpcS5raqSjEfKlJcWy2HNdgUasR66fAnVEYarrf1ULV4nfvpC1nZq/moA9qyqBcu83x+Jlrg==",
"dev": true,
"dependencies": {
"@types/node": "*"
}
}, },
"node_modules/@types/normalize-package-data": { "node_modules/@types/normalize-package-data": {
"version": "2.4.3", "version": "2.4.3",
@ -1691,9 +1703,9 @@
} }
}, },
"node_modules/acorn": { "node_modules/acorn": {
"version": "8.10.0", "version": "8.11.2",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
"integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
"dev": true, "dev": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
@ -1712,12 +1724,12 @@
} }
}, },
"node_modules/acquerello": { "node_modules/acquerello": {
"version": "1.0.12", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/acquerello/-/acquerello-1.0.12.tgz", "resolved": "https://registry.npmjs.org/acquerello/-/acquerello-1.1.2.tgz",
"integrity": "sha512-6yCYGUNctkYqF7DLmm0D/CxlRmM/OrzyuHOU+mbaO6VRxHmRg4EV0phvyBexRt6jTyDtEQIb09YFiwu5LExXsA==", "integrity": "sha512-V/ynq+ekRAls3iWOQMxA8G9pi40aTL9mheHHxA8x8oowZVjY7bROD99t+TSOKKp3BviACYOsNMlL+b+8jZ7ImQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=14.15.0" "node": ">= 18.18.0"
} }
}, },
"node_modules/agent-base": { "node_modules/agent-base": {
@ -2658,9 +2670,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001551", "version": "1.0.30001557",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001557.tgz",
"integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", "integrity": "sha512-91oR7hLNUP3gG6MLU+n96em322a8Xzes8wWdBKhLgUoiJsAF5irZnxSUCbc+qUZXNnPCfUwLOi9ZCZpkvjQajw==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -3125,17 +3137,17 @@
} }
}, },
"node_modules/cronometro": { "node_modules/cronometro": {
"version": "1.1.5", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/cronometro/-/cronometro-1.1.5.tgz", "resolved": "https://registry.npmjs.org/cronometro/-/cronometro-1.2.0.tgz",
"integrity": "sha512-uotkltVBg4WLAeCgbSsLhqpEyvYTn1J++bYcsq0i/RPNMHkMp4sN/7Hx+0O3UaCqIWJ4AG1dNrzDSkzt69jwQQ==", "integrity": "sha512-QeNGCuvNFimu4IJhZSL4oNopAmxfjRkSqh4rci4PZuNWKLRhqPC0oemw6gdbfgz0evqxOOS3uwtSt2FMR8dDXw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acquerello": "^1.0.12", "acquerello": "^1.1.2",
"hdr-histogram-js": "^3.0.0", "hdr-histogram-js": "^3.0.0",
"table": "^6.8.1" "table": "^6.8.1"
}, },
"engines": { "engines": {
"node": ">=14.15.0" "node": ">= 18.18.0"
} }
}, },
"node_modules/cross-spawn": { "node_modules/cross-spawn": {
@ -3782,9 +3794,9 @@
"dev": true "dev": true
}, },
"node_modules/electron-to-chromium": { "node_modules/electron-to-chromium": {
"version": "1.4.563", "version": "1.4.569",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz",
"integrity": "sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==", "integrity": "sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==",
"dev": true "dev": true
}, },
"node_modules/emittery": { "node_modules/emittery": {
@ -4268,26 +4280,26 @@
} }
}, },
"node_modules/eslint-plugin-import": { "node_modules/eslint-plugin-import": {
"version": "2.28.1", "version": "2.29.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz",
"integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"array-includes": "^3.1.6", "array-includes": "^3.1.7",
"array.prototype.findlastindex": "^1.2.2", "array.prototype.findlastindex": "^1.2.3",
"array.prototype.flat": "^1.3.1", "array.prototype.flat": "^1.3.2",
"array.prototype.flatmap": "^1.3.1", "array.prototype.flatmap": "^1.3.2",
"debug": "^3.2.7", "debug": "^3.2.7",
"doctrine": "^2.1.0", "doctrine": "^2.1.0",
"eslint-import-resolver-node": "^0.3.7", "eslint-import-resolver-node": "^0.3.9",
"eslint-module-utils": "^2.8.0", "eslint-module-utils": "^2.8.0",
"has": "^1.0.3", "hasown": "^2.0.0",
"is-core-module": "^2.13.0", "is-core-module": "^2.13.1",
"is-glob": "^4.0.3", "is-glob": "^4.0.3",
"minimatch": "^3.1.2", "minimatch": "^3.1.2",
"object.fromentries": "^2.0.6", "object.fromentries": "^2.0.7",
"object.groupby": "^1.0.0", "object.groupby": "^1.0.1",
"object.values": "^1.1.6", "object.values": "^1.1.7",
"semver": "^6.3.1", "semver": "^6.3.1",
"tsconfig-paths": "^3.14.2" "tsconfig-paths": "^3.14.2"
}, },
@ -4910,9 +4922,9 @@
} }
}, },
"node_modules/figlet": { "node_modules/figlet": {
"version": "1.6.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/figlet/-/figlet-1.6.0.tgz", "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.7.0.tgz",
"integrity": "sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==", "integrity": "sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==",
"dev": true, "dev": true,
"bin": { "bin": {
"figlet": "bin/index.js" "figlet": "bin/index.js"
@ -5624,15 +5636,6 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/has": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
"integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
"dev": true,
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-ansi": { "node_modules/has-ansi": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
@ -10764,11 +10767,12 @@
} }
}, },
"node_modules/selfsigned": { "node_modules/selfsigned": {
"version": "2.1.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
"integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/node-forge": "^1.3.0",
"node-forge": "^1" "node-forge": "^1"
}, },
"engines": { "engines": {
@ -14300,6 +14304,12 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/undici-types": {
"version": "5.26.5",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
"integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
"dev": true
},
"node_modules/unicode-length": { "node_modules/unicode-length": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz", "resolved": "https://registry.npmjs.org/unicode-length/-/unicode-length-2.1.0.tgz",

View File

@ -1,6 +1,6 @@
{ {
"name": "undici", "name": "undici",
"version": "5.26.4", "version": "5.27.0",
"description": "An HTTP/1.1 client, written from scratch for Node.js", "description": "An HTTP/1.1 client, written from scratch for Node.js",
"homepage": "https://undici.nodejs.org", "homepage": "https://undici.nodejs.org",
"bugs": { "bugs": {
@ -84,7 +84,7 @@
"test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w", "test:tdd": "tap test/*.js test/diagnostics-channel/*.js -w",
"test:typescript": "node scripts/verifyVersion.js 14 || tsd && tsc --skipLibCheck test/imports/undici-import.ts", "test:typescript": "node scripts/verifyVersion.js 14 || tsd && tsc --skipLibCheck test/imports/undici-import.ts",
"test:websocket": "node scripts/verifyVersion.js 18 || tap test/websocket/*.js", "test:websocket": "node scripts/verifyVersion.js 18 || tap test/websocket/*.js",
"test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node --no-warnings --expose-internals test/wpt/start-websockets.mjs)", "test:wpt": "node scripts/verifyVersion 18 || (node test/wpt/start-fetch.mjs && node test/wpt/start-FileAPI.mjs && node test/wpt/start-mimesniff.mjs && node test/wpt/start-xhr.mjs && node test/wpt/start-websockets.mjs)",
"coverage": "nyc --reporter=text --reporter=html npm run test", "coverage": "nyc --reporter=text --reporter=html npm run test",
"coverage:ci": "nyc --reporter=lcov npm run test", "coverage:ci": "nyc --reporter=lcov npm run test",
"bench": "PORT=3042 concurrently -k -s first npm:bench:server npm:bench:run", "bench": "PORT=3042 concurrently -k -s first npm:bench:server npm:bench:run",

View File

@ -53,5 +53,11 @@ declare namespace Undici {
var MockAgent: typeof import('./mock-agent').default; var MockAgent: typeof import('./mock-agent').default;
var mockErrors: typeof import('./mock-errors').default; var mockErrors: typeof import('./mock-errors').default;
var fetch: typeof import('./fetch').fetch; var fetch: typeof import('./fetch').fetch;
var Headers: typeof import('./fetch').Headers;
var Response: typeof import('./fetch').Response;
var Request: typeof import('./fetch').Request;
var FormData: typeof import('./formdata').FormData;
var File: typeof import('./file').File;
var FileReader: typeof import('./filereader').FileReader;
var caches: typeof import('./cache').caches; var caches: typeof import('./cache').caches;
} }

146
deps/undici/undici.js vendored
View File

@ -762,8 +762,10 @@ var require_constants = __commonJS({
"use strict"; "use strict";
var { MessageChannel, receiveMessageOnPort } = require("worker_threads"); var { MessageChannel, receiveMessageOnPort } = require("worker_threads");
var corsSafeListedMethods = ["GET", "HEAD", "POST"]; var corsSafeListedMethods = ["GET", "HEAD", "POST"];
var corsSafeListedMethodsSet = new Set(corsSafeListedMethods);
var nullBodyStatus = [101, 204, 205, 304]; var nullBodyStatus = [101, 204, 205, 304];
var redirectStatus = [301, 302, 303, 307, 308]; var redirectStatus = [301, 302, 303, 307, 308];
var redirectStatusSet = new Set(redirectStatus);
var badPorts = [ var badPorts = [
"1", "1",
"7", "7",
@ -846,6 +848,7 @@ var require_constants = __commonJS({
"6697", "6697",
"10080" "10080"
]; ];
var badPortsSet = new Set(badPorts);
var referrerPolicy = [ var referrerPolicy = [
"", "",
"no-referrer", "no-referrer",
@ -857,8 +860,10 @@ var require_constants = __commonJS({
"strict-origin-when-cross-origin", "strict-origin-when-cross-origin",
"unsafe-url" "unsafe-url"
]; ];
var referrerPolicySet = new Set(referrerPolicy);
var requestRedirect = ["follow", "manual", "error"]; var requestRedirect = ["follow", "manual", "error"];
var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"]; var safeMethods = ["GET", "HEAD", "OPTIONS", "TRACE"];
var safeMethodsSet = new Set(safeMethods);
var requestMode = ["navigate", "same-origin", "no-cors", "cors"]; var requestMode = ["navigate", "same-origin", "no-cors", "cors"];
var requestCredentials = ["omit", "same-origin", "include"]; var requestCredentials = ["omit", "same-origin", "include"];
var requestCache = [ var requestCache = [
@ -884,6 +889,7 @@ var require_constants = __commonJS({
"half" "half"
]; ];
var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"]; var forbiddenMethods = ["CONNECT", "TRACE", "TRACK"];
var forbiddenMethodsSet = new Set(forbiddenMethods);
var subresource = [ var subresource = [
"audio", "audio",
"audioworklet", "audioworklet",
@ -898,6 +904,7 @@ var require_constants = __commonJS({
"xslt", "xslt",
"" ""
]; ];
var subresourceSet = new Set(subresource);
var DOMException = globalThis.DOMException ?? (() => { var DOMException = globalThis.DOMException ?? (() => {
try { try {
atob("~"); atob("~");
@ -936,7 +943,14 @@ var require_constants = __commonJS({
nullBodyStatus, nullBodyStatus,
safeMethods, safeMethods,
badPorts, badPorts,
requestDuplex requestDuplex,
subresourceSet,
badPortsSet,
redirectStatusSet,
corsSafeListedMethodsSet,
safeMethodsSet,
forbiddenMethodsSet,
referrerPolicySet
}; };
} }
}); });
@ -983,7 +997,7 @@ var require_global = __commonJS({
var require_util2 = __commonJS({ var require_util2 = __commonJS({
"lib/fetch/util.js"(exports2, module2) { "lib/fetch/util.js"(exports2, module2) {
"use strict"; "use strict";
var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants(); var { redirectStatusSet, referrerPolicySet: referrerPolicyTokens, badPortsSet } = require_constants();
var { getGlobalOrigin } = require_global(); var { getGlobalOrigin } = require_global();
var { performance: performance2 } = require("perf_hooks"); var { performance: performance2 } = require("perf_hooks");
var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util();
@ -1001,7 +1015,7 @@ var require_util2 = __commonJS({
} }
__name(responseURL, "responseURL"); __name(responseURL, "responseURL");
function responseLocationURL(response, requestFragment) { function responseLocationURL(response, requestFragment) {
if (!redirectStatus.includes(response.status)) { if (!redirectStatusSet.has(response.status)) {
return null; return null;
} }
let location = response.headersList.get("location"); let location = response.headersList.get("location");
@ -1020,7 +1034,7 @@ var require_util2 = __commonJS({
__name(requestCurrentURL, "requestCurrentURL"); __name(requestCurrentURL, "requestCurrentURL");
function requestBadPort(request) { function requestBadPort(request) {
const url = requestCurrentURL(request); const url = requestCurrentURL(request);
if (urlIsHttpHttpsScheme(url) && badPorts.includes(url.port)) { if (urlIsHttpHttpsScheme(url) && badPortsSet.has(url.port)) {
return "blocked"; return "blocked";
} }
return "allowed"; return "allowed";
@ -1083,7 +1097,7 @@ var require_util2 = __commonJS({
if (policyHeader.length > 0) { if (policyHeader.length > 0) {
for (let i = policyHeader.length; i !== 0; i--) { for (let i = policyHeader.length; i !== 0; i--) {
const token = policyHeader[i - 1].trim(); const token = policyHeader[i - 1].trim();
if (referrerPolicyTokens.includes(token)) { if (referrerPolicyTokens.has(token)) {
policy = token; policy = token;
break; break;
} }
@ -4037,6 +4051,7 @@ var require_file = __commonJS({
var { webidl } = require_webidl(); var { webidl } = require_webidl();
var { parseMIMEType, serializeAMimeType } = require_dataURL(); var { parseMIMEType, serializeAMimeType } = require_dataURL();
var { kEnumerableProperty } = require_util(); var { kEnumerableProperty } = require_util();
var encoder = new TextEncoder();
var File = class _File extends Blob2 { var File = class _File extends Blob2 {
static { static {
__name(this, "File"); __name(this, "File");
@ -4188,7 +4203,7 @@ var require_file = __commonJS({
if (options.endings === "native") { if (options.endings === "native") {
s = convertLineEndingsNative(s); s = convertLineEndingsNative(s);
} }
bytes.push(new TextEncoder().encode(s)); bytes.push(encoder.encode(s));
} else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) { } else if (types.isAnyArrayBuffer(element) || types.isTypedArray(element)) {
if (!element.buffer) { if (!element.buffer) {
bytes.push(new Uint8Array(element)); bytes.push(new Uint8Array(element));
@ -4407,6 +4422,8 @@ var require_body = __commonJS({
var { parseMIMEType, serializeAMimeType } = require_dataURL(); var { parseMIMEType, serializeAMimeType } = require_dataURL();
var ReadableStream = globalThis.ReadableStream; var ReadableStream = globalThis.ReadableStream;
var File = NativeFile ?? UndiciFile; var File = NativeFile ?? UndiciFile;
var textEncoder = new TextEncoder();
var textDecoder = new TextDecoder();
function extractBody(object, keepalive = false) { function extractBody(object, keepalive = false) {
if (!ReadableStream) { if (!ReadableStream) {
ReadableStream = require("stream/web").ReadableStream; ReadableStream = require("stream/web").ReadableStream;
@ -4420,7 +4437,7 @@ var require_body = __commonJS({
stream = new ReadableStream({ stream = new ReadableStream({
async pull(controller) { async pull(controller) {
controller.enqueue( controller.enqueue(
typeof source === "string" ? new TextEncoder().encode(source) : source typeof source === "string" ? textEncoder.encode(source) : source
); );
queueMicrotask(() => readableStreamClose(controller)); queueMicrotask(() => readableStreamClose(controller));
}, },
@ -4450,21 +4467,20 @@ var require_body = __commonJS({
Content-Disposition: form-data`; Content-Disposition: form-data`;
const escape = /* @__PURE__ */ __name((str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"), "escape"); const escape = /* @__PURE__ */ __name((str) => str.replace(/\n/g, "%0A").replace(/\r/g, "%0D").replace(/"/g, "%22"), "escape");
const normalizeLinefeeds = /* @__PURE__ */ __name((value) => value.replace(/\r?\n|\r/g, "\r\n"), "normalizeLinefeeds"); const normalizeLinefeeds = /* @__PURE__ */ __name((value) => value.replace(/\r?\n|\r/g, "\r\n"), "normalizeLinefeeds");
const enc = new TextEncoder();
const blobParts = []; const blobParts = [];
const rn = new Uint8Array([13, 10]); const rn = new Uint8Array([13, 10]);
length = 0; length = 0;
let hasUnknownSizeValue = false; let hasUnknownSizeValue = false;
for (const [name, value] of object) { for (const [name, value] of object) {
if (typeof value === "string") { if (typeof value === "string") {
const chunk2 = enc.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r const chunk2 = textEncoder.encode(prefix + `; name="${escape(normalizeLinefeeds(name))}"\r
\r \r
${normalizeLinefeeds(value)}\r ${normalizeLinefeeds(value)}\r
`); `);
blobParts.push(chunk2); blobParts.push(chunk2);
length += chunk2.byteLength; length += chunk2.byteLength;
} else { } else {
const chunk2 = enc.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r const chunk2 = textEncoder.encode(`${prefix}; name="${escape(normalizeLinefeeds(name))}"` + (value.name ? `; filename="${escape(value.name)}"` : "") + `\r
Content-Type: ${value.type || "application/octet-stream"}\r Content-Type: ${value.type || "application/octet-stream"}\r
\r \r
`); `);
@ -4476,7 +4492,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
} }
} }
} }
const chunk = enc.encode(`--${boundary}--`); const chunk = textEncoder.encode(`--${boundary}--`);
blobParts.push(chunk); blobParts.push(chunk);
length += chunk.byteLength; length += chunk.byteLength;
if (hasUnknownSizeValue) { if (hasUnknownSizeValue) {
@ -4671,14 +4687,14 @@ Content-Type: ${value.type || "application/octet-stream"}\r
let entries; let entries;
try { try {
let text = ""; let text = "";
const textDecoder = new TextDecoder("utf-8", { ignoreBOM: true }); const streamingDecoder = new TextDecoder("utf-8", { ignoreBOM: true });
for await (const chunk of consumeBody(this[kState].body)) { for await (const chunk of consumeBody(this[kState].body)) {
if (!isUint8Array(chunk)) { if (!isUint8Array(chunk)) {
throw new TypeError("Expected Uint8Array chunk"); throw new TypeError("Expected Uint8Array chunk");
} }
text += textDecoder.decode(chunk, { stream: true }); text += streamingDecoder.decode(chunk, { stream: true });
} }
text += textDecoder.decode(); text += streamingDecoder.decode();
entries = new URLSearchParams(text); entries = new URLSearchParams(text);
} catch (err) { } catch (err) {
throw Object.assign(new TypeError(), { cause: err }); throw Object.assign(new TypeError(), { cause: err });
@ -4739,7 +4755,7 @@ Content-Type: ${value.type || "application/octet-stream"}\r
if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) { if (buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191) {
buffer = buffer.subarray(3); buffer = buffer.subarray(3);
} }
const output = new TextDecoder().decode(buffer); const output = textDecoder.decode(buffer);
return output; return output;
} }
__name(utf8DecodeBytes, "utf8DecodeBytes"); __name(utf8DecodeBytes, "utf8DecodeBytes");
@ -4783,7 +4799,7 @@ var require_response = __commonJS({
isomorphicEncode isomorphicEncode
} = require_util2(); } = require_util2();
var { var {
redirectStatus, redirectStatusSet,
nullBodyStatus, nullBodyStatus,
DOMException DOMException
} = require_constants(); } = require_constants();
@ -4796,6 +4812,7 @@ var require_response = __commonJS({
var assert = require("assert"); var assert = require("assert");
var { types } = require("util"); var { types } = require("util");
var ReadableStream = globalThis.ReadableStream || require("stream/web").ReadableStream; var ReadableStream = globalThis.ReadableStream || require("stream/web").ReadableStream;
var textEncoder = new TextEncoder("utf-8");
var Response = class _Response { var Response = class _Response {
static { static {
__name(this, "Response"); __name(this, "Response");
@ -4817,7 +4834,7 @@ var require_response = __commonJS({
if (init !== null) { if (init !== null) {
init = webidl.converters.ResponseInit(init); init = webidl.converters.ResponseInit(init);
} }
const bytes = new TextEncoder("utf-8").encode( const bytes = textEncoder.encode(
serializeJavascriptValueToJSONString(data) serializeJavascriptValueToJSONString(data)
); );
const body = extractBody(bytes); const body = extractBody(bytes);
@ -4843,7 +4860,7 @@ var require_response = __commonJS({
cause: err cause: err
}); });
} }
if (!redirectStatus.includes(status)) { if (!redirectStatusSet.has(status)) {
throw new RangeError("Invalid status code " + status); throw new RangeError("Invalid status code " + status);
} }
const responseObject = new _Response(); const responseObject = new _Response();
@ -5216,8 +5233,8 @@ var require_request = __commonJS({
makePolicyContainer makePolicyContainer
} = require_util2(); } = require_util2();
var { var {
forbiddenMethods, forbiddenMethodsSet,
corsSafeListedMethods, corsSafeListedMethodsSet,
referrerPolicy, referrerPolicy,
requestRedirect, requestRedirect,
requestMode, requestMode,
@ -5410,7 +5427,7 @@ var require_request = __commonJS({
if (!isValidHTTPToken(init.method)) { if (!isValidHTTPToken(init.method)) {
throw TypeError(`'${init.method}' is not a valid HTTP method.`); throw TypeError(`'${init.method}' is not a valid HTTP method.`);
} }
if (forbiddenMethods.indexOf(method.toUpperCase()) !== -1) { if (forbiddenMethodsSet.has(method.toUpperCase())) {
throw TypeError(`'${init.method}' HTTP method is unsupported.`); throw TypeError(`'${init.method}' HTTP method is unsupported.`);
} }
method = normalizeMethod(init.method); method = normalizeMethod(init.method);
@ -5457,7 +5474,7 @@ var require_request = __commonJS({
this[kHeaders][kGuard] = "request"; this[kHeaders][kGuard] = "request";
this[kHeaders][kRealm] = this[kRealm]; this[kHeaders][kRealm] = this[kRealm];
if (mode === "no-cors") { if (mode === "no-cors") {
if (!corsSafeListedMethods.includes(request.method)) { if (!corsSafeListedMethodsSet.has(request.method)) {
throw new TypeError( throw new TypeError(
`'${request.method} is unsupported in no-cors mode.` `'${request.method} is unsupported in no-cors mode.`
); );
@ -6544,6 +6561,13 @@ var require_request2 = __commonJS({
if (channels.bodySent.hasSubscribers) { if (channels.bodySent.hasSubscribers) {
channels.bodySent.publish({ request: this }); channels.bodySent.publish({ request: this });
} }
if (this[kHandler].onRequestSent) {
try {
this[kHandler].onRequestSent();
} catch (err) {
this.onError(err);
}
}
} }
onConnect(abort) { onConnect(abort) {
assert(!this.aborted); assert(!this.aborted);
@ -9448,11 +9472,11 @@ var require_fetch = __commonJS({
var assert = require("assert"); var assert = require("assert");
var { safelyExtractBody } = require_body(); var { safelyExtractBody } = require_body();
var { var {
redirectStatus, redirectStatusSet,
nullBodyStatus, nullBodyStatus,
safeMethods, safeMethodsSet,
requestBodyHeader, requestBodyHeader,
subresource, subresourceSet,
DOMException DOMException
} = require_constants(); } = require_constants();
var { kHeadersList } = require_symbols(); var { kHeadersList } = require_symbols();
@ -9464,6 +9488,7 @@ var require_fetch = __commonJS({
var { getGlobalDispatcher } = require_global2(); var { getGlobalDispatcher } = require_global2();
var { webidl } = require_webidl(); var { webidl } = require_webidl();
var { STATUS_CODES } = require("http"); var { STATUS_CODES } = require("http");
var GET_OR_HEAD = ["GET", "HEAD"];
var resolveObjectURL; var resolveObjectURL;
var ReadableStream = globalThis.ReadableStream; var ReadableStream = globalThis.ReadableStream;
var Fetch = class extends EE { var Fetch = class extends EE {
@ -9500,7 +9525,7 @@ var require_fetch = __commonJS({
this.emit("terminated", error); this.emit("terminated", error);
} }
}; };
async function fetch2(input, init = {}) { function fetch2(input, init = {}) {
webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" }); webidl.argumentLengthCheck(arguments, 1, { header: "globalThis.fetch" });
const p = createDeferredPromise(); const p = createDeferredPromise();
let requestObject; let requestObject;
@ -9535,17 +9560,17 @@ var require_fetch = __commonJS({
const handleFetchDone = /* @__PURE__ */ __name((response) => finalizeAndReportTiming(response, "fetch"), "handleFetchDone"); const handleFetchDone = /* @__PURE__ */ __name((response) => finalizeAndReportTiming(response, "fetch"), "handleFetchDone");
const processResponse = /* @__PURE__ */ __name((response) => { const processResponse = /* @__PURE__ */ __name((response) => {
if (locallyAborted) { if (locallyAborted) {
return; return Promise.resolve();
} }
if (response.aborted) { if (response.aborted) {
abortFetch(p, request, responseObject, controller.serializedAbortReason); abortFetch(p, request, responseObject, controller.serializedAbortReason);
return; return Promise.resolve();
} }
if (response.type === "error") { if (response.type === "error") {
p.reject( p.reject(
Object.assign(new TypeError("fetch failed"), { cause: response.error }) Object.assign(new TypeError("fetch failed"), { cause: response.error })
); );
return; return Promise.resolve();
} }
responseObject = new Response(); responseObject = new Response();
responseObject[kState] = response; responseObject[kState] = response;
@ -9689,7 +9714,7 @@ var require_fetch = __commonJS({
} }
if (request.priority === null) { if (request.priority === null) {
} }
if (subresource.includes(request.destination)) { if (subresourceSet.has(request.destination)) {
} }
mainFetch(fetchParams).catch((err) => { mainFetch(fetchParams).catch((err) => {
fetchParams.controller.terminate(err); fetchParams.controller.terminate(err);
@ -9795,15 +9820,15 @@ var require_fetch = __commonJS({
} }
} }
__name(mainFetch, "mainFetch"); __name(mainFetch, "mainFetch");
async function schemeFetch(fetchParams) { function schemeFetch(fetchParams) {
if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) { if (isCancelled(fetchParams) && fetchParams.request.redirectCount === 0) {
return makeAppropriateNetworkError(fetchParams); return Promise.resolve(makeAppropriateNetworkError(fetchParams));
} }
const { request } = fetchParams; const { request } = fetchParams;
const { protocol: scheme } = requestCurrentURL(request); const { protocol: scheme } = requestCurrentURL(request);
switch (scheme) { switch (scheme) {
case "about:": { case "about:": {
return makeNetworkError("about scheme is not supported"); return Promise.resolve(makeNetworkError("about scheme is not supported"));
} }
case "blob:": { case "blob:": {
if (!resolveObjectURL) { if (!resolveObjectURL) {
@ -9811,11 +9836,11 @@ var require_fetch = __commonJS({
} }
const blobURLEntry = requestCurrentURL(request); const blobURLEntry = requestCurrentURL(request);
if (blobURLEntry.search.length !== 0) { if (blobURLEntry.search.length !== 0) {
return makeNetworkError("NetworkError when attempting to fetch resource."); return Promise.resolve(makeNetworkError("NetworkError when attempting to fetch resource."));
} }
const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString()); const blobURLEntryObject = resolveObjectURL(blobURLEntry.toString());
if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) { if (request.method !== "GET" || !isBlobLike(blobURLEntryObject)) {
return makeNetworkError("invalid method"); return Promise.resolve(makeNetworkError("invalid method"));
} }
const bodyWithType = safelyExtractBody(blobURLEntryObject); const bodyWithType = safelyExtractBody(blobURLEntryObject);
const body = bodyWithType[0]; const body = bodyWithType[0];
@ -9829,32 +9854,32 @@ var require_fetch = __commonJS({
] ]
}); });
response.body = body; response.body = body;
return response; return Promise.resolve(response);
} }
case "data:": { case "data:": {
const currentURL = requestCurrentURL(request); const currentURL = requestCurrentURL(request);
const dataURLStruct = dataURLProcessor(currentURL); const dataURLStruct = dataURLProcessor(currentURL);
if (dataURLStruct === "failure") { if (dataURLStruct === "failure") {
return makeNetworkError("failed to fetch the data URL"); return Promise.resolve(makeNetworkError("failed to fetch the data URL"));
} }
const mimeType = serializeAMimeType(dataURLStruct.mimeType); const mimeType = serializeAMimeType(dataURLStruct.mimeType);
return makeResponse({ return Promise.resolve(makeResponse({
statusText: "OK", statusText: "OK",
headersList: [ headersList: [
["content-type", { name: "Content-Type", value: mimeType }] ["content-type", { name: "Content-Type", value: mimeType }]
], ],
body: safelyExtractBody(dataURLStruct.body)[0] body: safelyExtractBody(dataURLStruct.body)[0]
}); }));
} }
case "file:": { case "file:": {
return makeNetworkError("not implemented... yet..."); return Promise.resolve(makeNetworkError("not implemented... yet..."));
} }
case "http:": case "http:":
case "https:": { case "https:": {
return await httpFetch(fetchParams).catch((err) => makeNetworkError(err)); return httpFetch(fetchParams).catch((err) => makeNetworkError(err));
} }
default: { default: {
return makeNetworkError("unknown scheme"); return Promise.resolve(makeNetworkError("unknown scheme"));
} }
} }
} }
@ -9866,7 +9891,7 @@ var require_fetch = __commonJS({
} }
} }
__name(finalizeResponse, "finalizeResponse"); __name(finalizeResponse, "finalizeResponse");
async function fetchFinale(fetchParams, response) { function fetchFinale(fetchParams, response) {
if (response.type === "error") { if (response.type === "error") {
response.urlList = [fetchParams.request.urlList[0]]; response.urlList = [fetchParams.request.urlList[0]];
response.timingInfo = createOpaqueTimingInfo({ response.timingInfo = createOpaqueTimingInfo({
@ -9910,8 +9935,9 @@ var require_fetch = __commonJS({
if (response.body == null) { if (response.body == null) {
queueMicrotask(() => processBody(null)); queueMicrotask(() => processBody(null));
} else { } else {
await fullyReadBody(response.body, processBody, processBodyError); return fullyReadBody(response.body, processBody, processBodyError);
} }
return Promise.resolve();
} }
} }
__name(fetchFinale, "fetchFinale"); __name(fetchFinale, "fetchFinale");
@ -9942,7 +9968,7 @@ var require_fetch = __commonJS({
) === "blocked") { ) === "blocked") {
return makeNetworkError("blocked"); return makeNetworkError("blocked");
} }
if (redirectStatus.includes(actualResponse.status)) { if (redirectStatusSet.has(actualResponse.status)) {
if (request.redirect !== "manual") { if (request.redirect !== "manual") {
fetchParams.controller.connection.destroy(); fetchParams.controller.connection.destroy();
} }
@ -9960,7 +9986,7 @@ var require_fetch = __commonJS({
return response; return response;
} }
__name(httpFetch, "httpFetch"); __name(httpFetch, "httpFetch");
async function httpRedirectFetch(fetchParams, response) { function httpRedirectFetch(fetchParams, response) {
const request = fetchParams.request; const request = fetchParams.request;
const actualResponse = response.internalResponse ? response.internalResponse : response; const actualResponse = response.internalResponse ? response.internalResponse : response;
let locationURL; let locationURL;
@ -9973,27 +9999,27 @@ var require_fetch = __commonJS({
return response; return response;
} }
} catch (err) { } catch (err) {
return makeNetworkError(err); return Promise.resolve(makeNetworkError(err));
} }
if (!urlIsHttpHttpsScheme(locationURL)) { if (!urlIsHttpHttpsScheme(locationURL)) {
return makeNetworkError("URL scheme must be a HTTP(S) scheme"); return Promise.resolve(makeNetworkError("URL scheme must be a HTTP(S) scheme"));
} }
if (request.redirectCount === 20) { if (request.redirectCount === 20) {
return makeNetworkError("redirect count exceeded"); return Promise.resolve(makeNetworkError("redirect count exceeded"));
} }
request.redirectCount += 1; request.redirectCount += 1;
if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) { if (request.mode === "cors" && (locationURL.username || locationURL.password) && !sameOrigin(request, locationURL)) {
return makeNetworkError('cross origin not allowed for request mode "cors"'); return Promise.resolve(makeNetworkError('cross origin not allowed for request mode "cors"'));
} }
if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) { if (request.responseTainting === "cors" && (locationURL.username || locationURL.password)) {
return makeNetworkError( return Promise.resolve(makeNetworkError(
'URL cannot contain credentials for request mode "cors"' 'URL cannot contain credentials for request mode "cors"'
); ));
} }
if (actualResponse.status !== 303 && request.body != null && request.body.source == null) { if (actualResponse.status !== 303 && request.body != null && request.body.source == null) {
return makeNetworkError(); return Promise.resolve(makeNetworkError());
} }
if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !["GET", "HEAD"].includes(request.method)) { if ([301, 302].includes(actualResponse.status) && request.method === "POST" || actualResponse.status === 303 && !GET_OR_HEAD.includes(request.method)) {
request.method = "GET"; request.method = "GET";
request.body = null; request.body = null;
for (const headerName of requestBodyHeader) { for (const headerName of requestBodyHeader) {
@ -10097,7 +10123,7 @@ var require_fetch = __commonJS({
includeCredentials, includeCredentials,
isNewConnectionFetch isNewConnectionFetch
); );
if (!safeMethods.includes(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) { if (!safeMethodsSet.has(httpRequest.method) && forwardResponse.status >= 200 && forwardResponse.status <= 399) {
} }
if (revalidatingFlag && forwardResponse.status === 304) { if (revalidatingFlag && forwardResponse.status === 304) {
} }
@ -10363,7 +10389,7 @@ var require_fetch = __commonJS({
} }
this.body = new Readable({ read: resume }); this.body = new Readable({ read: resume });
const decoders = []; const decoders = [];
const willFollow = request.redirect === "follow" && location && redirectStatus.includes(status); const willFollow = request.redirect === "follow" && location && redirectStatusSet.has(status);
if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) { if (request.method !== "HEAD" && request.method !== "CONNECT" && !nullBodyStatus.includes(status) && !willFollow) {
for (const coding of codings) { for (const coding of codings) {
if (coding === "x-gzip" || coding === "gzip") { if (coding === "x-gzip" || coding === "gzip") {
@ -11723,13 +11749,11 @@ var require_websocket = __commonJS({
// index-fetch.js // index-fetch.js
var fetchImpl = require_fetch().fetch; var fetchImpl = require_fetch().fetch;
module.exports.fetch = /* @__PURE__ */ __name(async function fetch(resource, init = void 0) { module.exports.fetch = /* @__PURE__ */ __name(function fetch(resource, init = void 0) {
try { return fetchImpl(resource, init).catch((err) => {
return await fetchImpl(resource, init);
} catch (err) {
Error.captureStackTrace(err, this); Error.captureStackTrace(err, this);
throw err; throw err;
} });
}, "fetch"); }, "fetch");
module.exports.FormData = require_formdata().FormData; module.exports.FormData = require_formdata().FormData;
module.exports.Headers = require_headers().Headers; module.exports.Headers = require_headers().Headers;

View File

@ -28,7 +28,7 @@ This a list of all the dependencies:
* [openssl 3.0.8][] * [openssl 3.0.8][]
* [postject 1.0.0-alpha.6][] * [postject 1.0.0-alpha.6][]
* [simdutf 3.2.18][] * [simdutf 3.2.18][]
* [undici 5.26.4][] * [undici 5.27.0][]
* [uvwasi 0.0.19][] * [uvwasi 0.0.19][]
* [V8 11.8.172.12][] * [V8 11.8.172.12][]
* [zlib 1.2.13.1-motley-fef5869][] * [zlib 1.2.13.1-motley-fef5869][]
@ -291,7 +291,7 @@ The [postject](https://github.com/nodejs/postject) dependency is used for the
The [simdutf](https://github.com/simdutf/simdutf) dependency is The [simdutf](https://github.com/simdutf/simdutf) dependency is
a C++ library for fast UTF-8 decoding and encoding. a C++ library for fast UTF-8 decoding and encoding.
### undici 5.26.4 ### undici 5.27.0
The [undici](https://github.com/nodejs/undici) dependency is an HTTP/1.1 client, The [undici](https://github.com/nodejs/undici) dependency is an HTTP/1.1 client,
written from scratch for Node.js.. written from scratch for Node.js..
@ -345,7 +345,7 @@ performance improvements not currently available in standard zlib.
[openssl 3.0.8]: #openssl-308 [openssl 3.0.8]: #openssl-308
[postject 1.0.0-alpha.6]: #postject-100-alpha6 [postject 1.0.0-alpha.6]: #postject-100-alpha6
[simdutf 3.2.18]: #simdutf-3218 [simdutf 3.2.18]: #simdutf-3218
[undici 5.26.4]: #undici-5264 [undici 5.27.0]: #undici-5270
[update-openssl-action]: ../../../.github/workflows/update-openssl.yml [update-openssl-action]: ../../../.github/workflows/update-openssl.yml
[uvwasi 0.0.19]: #uvwasi-0019 [uvwasi 0.0.19]: #uvwasi-0019
[v8 11.8.172.12]: #v8-11817212 [v8 11.8.172.12]: #v8-11817212

View File

@ -2,5 +2,5 @@
// Refer to tools/dep_updaters/update-undici.sh // Refer to tools/dep_updaters/update-undici.sh
#ifndef SRC_UNDICI_VERSION_H_ #ifndef SRC_UNDICI_VERSION_H_
#define SRC_UNDICI_VERSION_H_ #define SRC_UNDICI_VERSION_H_
#define UNDICI_VERSION "5.26.4" #define UNDICI_VERSION "5.27.0"
#endif // SRC_UNDICI_VERSION_H_ #endif // SRC_UNDICI_VERSION_H_