diff options
Diffstat (limited to 'deps/undici/undici.js')
-rw-r--r-- | deps/undici/undici.js | 254 |
1 files changed, 149 insertions, 105 deletions
diff --git a/deps/undici/undici.js b/deps/undici/undici.js index 145977f83d..cccf3f1043 100644 --- a/deps/undici/undici.js +++ b/deps/undici/undici.js @@ -300,7 +300,7 @@ var require_util = __commonJS({ function nop() { } function isStream(obj) { - return obj && typeof obj.pipe === "function"; + return obj && typeof obj === "object" && typeof obj.pipe === "function" && typeof obj.on === "function"; } function isBlobLike(object) { return Blob && object instanceof Blob || object && typeof object === "object" && (typeof object.stream === "function" || typeof object.arrayBuffer === "function") && /^(Blob|File)$/.test(object[Symbol.toStringTag]); @@ -318,6 +318,10 @@ var require_util = __commonJS({ function parseURL(url) { if (typeof url === "string") { url = new URL(url); + if (!/^https?:/.test(url.origin || url.protocol)) { + throw new InvalidArgumentError("invalid protocol"); + } + return url; } if (!url || typeof url !== "object") { throw new InvalidArgumentError("invalid url"); @@ -549,8 +553,22 @@ var require_util = __commonJS({ } }, 0); } - function isFormDataLike(chunk) { - return chunk && chunk.constructor && chunk.constructor.name === "FormData" && typeof chunk === "object" && (typeof chunk.append === "function" && typeof chunk.delete === "function" && typeof chunk.get === "function" && typeof chunk.getAll === "function" && typeof chunk.has === "function" && typeof chunk.set === "function" && typeof chunk.entries === "function" && typeof chunk.keys === "function" && typeof chunk.values === "function" && typeof chunk.forEach === "function"); + function isFormDataLike(object) { + return object && typeof object === "object" && typeof object.append === "function" && typeof object.delete === "function" && typeof object.get === "function" && typeof object.getAll === "function" && typeof object.has === "function" && typeof object.set === "function" && object[Symbol.toStringTag] === "FormData"; + } + function throwIfAborted(signal) { + if (!signal) { + return; + } + if (typeof signal.throwIfAborted === "function") { + signal.throwIfAborted(); + } else { + if (signal.aborted) { + const err = new Error("The operation was aborted"); + err.name = "AbortError"; + throw err; + } + } } var kEnumerableProperty = /* @__PURE__ */ Object.create(null); kEnumerableProperty.enumerable = true; @@ -582,6 +600,7 @@ var require_util = __commonJS({ getSocketInfo, isFormDataLike, buildURL, + throwIfAborted, nodeMajor, nodeMinor, nodeHasAutoSelectFamily: nodeMajor > 18 || nodeMajor === 18 && nodeMinor >= 13 @@ -767,11 +786,51 @@ var require_constants = __commonJS({ } }); +// lib/fetch/global.js +var require_global = __commonJS({ + "lib/fetch/global.js"(exports2, module2) { + "use strict"; + var globalOrigin = Symbol.for("undici.globalOrigin.1"); + function getGlobalOrigin() { + return globalThis[globalOrigin]; + } + function setGlobalOrigin(newOrigin) { + if (newOrigin !== void 0 && typeof newOrigin !== "string" && !(newOrigin instanceof URL)) { + throw new Error("Invalid base url"); + } + if (newOrigin === void 0) { + Object.defineProperty(globalThis, globalOrigin, { + value: void 0, + writable: true, + enumerable: false, + configurable: false + }); + return; + } + const parsedURL = new URL(newOrigin); + if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { + throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); + } + Object.defineProperty(globalThis, globalOrigin, { + value: parsedURL, + writable: true, + enumerable: false, + configurable: false + }); + } + module2.exports = { + getGlobalOrigin, + setGlobalOrigin + }; + } +}); + // lib/fetch/util.js var require_util2 = __commonJS({ "lib/fetch/util.js"(exports2, module2) { "use strict"; var { redirectStatus, badPorts, referrerPolicy: referrerPolicyTokens } = require_constants(); + var { getGlobalOrigin } = require_global(); var { performance: performance2 } = require("perf_hooks"); var { isBlobLike, toUSVString, ReadableStreamFrom } = require_util(); var assert = require("assert"); @@ -791,7 +850,9 @@ var require_util2 = __commonJS({ return null; } let location = response.headersList.get("location"); - location = location ? new URL(location, responseURL(response)) : null; + if (location !== null && isValidHeaderValue(location)) { + location = new URL(location, responseURL(response)); + } if (location && !location.hash) { location.hash = requestFragment; } @@ -884,7 +945,7 @@ var require_util2 = __commonJS({ let serializedOrigin = request.origin; if (request.responseTainting === "cors" || request.mode === "websocket") { if (serializedOrigin) { - request.headersList.append("Origin", serializedOrigin); + request.headersList.append("origin", serializedOrigin); } } else if (request.method !== "GET" && request.method !== "HEAD") { switch (request.referrerPolicy) { @@ -906,7 +967,7 @@ var require_util2 = __commonJS({ default: } if (serializedOrigin) { - request.headersList.append("Origin", serializedOrigin); + request.headersList.append("origin", serializedOrigin); } } } @@ -929,68 +990,73 @@ var require_util2 = __commonJS({ }; } function makePolicyContainer() { - return {}; + return { + referrerPolicy: "strict-origin-when-cross-origin" + }; } - function clonePolicyContainer() { - return {}; + function clonePolicyContainer(policyContainer) { + return { + referrerPolicy: policyContainer.referrerPolicy + }; } function determineRequestsReferrer(request) { const policy = request.referrerPolicy; - if (policy == null || policy === "" || policy === "no-referrer") { - return "no-referrer"; - } - const environment = request.client; + assert(policy); let referrerSource = null; if (request.referrer === "client") { - if (request.client?.globalObject?.constructor?.name === "Window") { - const origin = environment.globalObject.self?.origin ?? environment.globalObject.location?.origin; - if (origin == null || origin === "null") - return "no-referrer"; - referrerSource = new URL(environment.globalObject.location.href); - } else { - if (environment?.globalObject?.location == null) { - return "no-referrer"; - } - referrerSource = new URL(environment.globalObject.location.href); + const globalOrigin = getGlobalOrigin(); + if (!globalOrigin || globalOrigin.origin === "null") { + return "no-referrer"; } + referrerSource = new URL(globalOrigin); } else if (request.referrer instanceof URL) { referrerSource = request.referrer; - } else { - return "no-referrer"; } - const urlProtocol = referrerSource.protocol; - if (urlProtocol === "about:" || urlProtocol === "data:" || urlProtocol === "blob:") { - return "no-referrer"; + let referrerURL = stripURLForReferrer(referrerSource); + const referrerOrigin = stripURLForReferrer(referrerSource, true); + if (referrerURL.toString().length > 4096) { + referrerURL = referrerOrigin; } - let temp; - let referrerOrigin; - const referrerUrl = (temp = stripURLForReferrer(referrerSource)).length > 4096 ? referrerOrigin = stripURLForReferrer(referrerSource, true) : temp; - const areSameOrigin = sameOrigin(request, referrerUrl); - const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerUrl) && !isURLPotentiallyTrustworthy(request.url); + const areSameOrigin = sameOrigin(request, referrerURL); + const isNonPotentiallyTrustWorthy = isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(request.url); switch (policy) { case "origin": return referrerOrigin != null ? referrerOrigin : stripURLForReferrer(referrerSource, true); case "unsafe-url": - return referrerUrl; + return referrerURL; case "same-origin": return areSameOrigin ? referrerOrigin : "no-referrer"; case "origin-when-cross-origin": - return areSameOrigin ? referrerUrl : referrerOrigin; - case "strict-origin-when-cross-origin": - if (areSameOrigin) - return referrerOrigin; + return areSameOrigin ? referrerURL : referrerOrigin; + case "strict-origin-when-cross-origin": { + const currentURL = requestCurrentURL(request); + if (sameOrigin(referrerURL, currentURL)) { + return referrerURL; + } + if (isURLPotentiallyTrustworthy(referrerURL) && !isURLPotentiallyTrustworthy(currentURL)) { + return "no-referrer"; + } + return referrerOrigin; + } case "strict-origin": case "no-referrer-when-downgrade": default: return isNonPotentiallyTrustWorthy ? "no-referrer" : referrerOrigin; } - function stripURLForReferrer(url, originOnly = false) { - const urlObject = new URL(url.href); - urlObject.username = ""; - urlObject.password = ""; - urlObject.hash = ""; - return originOnly ? urlObject.origin : urlObject.href; + } + function stripURLForReferrer(url, originOnly) { + assert(url instanceof URL); + if (url.protocol === "file:" || url.protocol === "about:" || url.protocol === "blank:") { + return "no-referrer"; + } + url.username = ""; + url.password = ""; + url.hash = ""; + if (originOnly) { + url.pathname = ""; + url.search = ""; } + return url; } function isURLPotentiallyTrustworthy(url) { if (!(url instanceof URL)) { @@ -5620,7 +5686,6 @@ var require_dataURL = __commonJS({ "lib/fetch/dataURL.js"(exports2, module2) { var assert = require("assert"); var { atob: atob2 } = require("buffer"); - var { format } = require("url"); var { isValidHTTPToken, isomorphicDecode } = require_util2(); var encoder = new TextEncoder(); var HTTP_TOKEN_CODEPOINTS = /^[!#$%&'*+-.^_|~A-z0-9]+$/; @@ -5660,7 +5725,15 @@ var require_dataURL = __commonJS({ return { mimeType: mimeTypeRecord, body }; } function URLSerializer(url, excludeFragment = false) { - return format(url, { fragment: !excludeFragment }); + const href = url.href; + if (!excludeFragment) { + return href; + } + const hash = href.lastIndexOf("#"); + if (hash === -1) { + return href; + } + return href.slice(0, hash); } function collectASequenceOfCodePoints(condition, input, position) { let result = ""; @@ -6514,45 +6587,6 @@ Content-Type: ${value.type || "application/octet-stream"}\r } }); -// lib/fetch/global.js -var require_global = __commonJS({ - "lib/fetch/global.js"(exports2, module2) { - "use strict"; - var globalOrigin = Symbol.for("undici.globalOrigin.1"); - function getGlobalOrigin() { - return globalThis[globalOrigin]; - } - function setGlobalOrigin(newOrigin) { - if (newOrigin !== void 0 && typeof newOrigin !== "string" && !(newOrigin instanceof URL)) { - throw new Error("Invalid base url"); - } - if (newOrigin === void 0) { - Object.defineProperty(globalThis, globalOrigin, { - value: void 0, - writable: true, - enumerable: false, - configurable: false - }); - return; - } - const parsedURL = new URL(newOrigin); - if (parsedURL.protocol !== "http:" && parsedURL.protocol !== "https:") { - throw new TypeError(`Only http & https urls are allowed, received ${parsedURL.protocol}`); - } - Object.defineProperty(globalThis, globalOrigin, { - value: parsedURL, - writable: true, - enumerable: false, - configurable: false - }); - } - module2.exports = { - getGlobalOrigin, - setGlobalOrigin - }; - } -}); - // lib/fetch/response.js var require_response = __commonJS({ "lib/fetch/response.js"(exports2, module2) { @@ -6954,7 +6988,8 @@ var require_request = __commonJS({ var { isValidHTTPToken, sameOrigin, - normalizeMethod + normalizeMethod, + makePolicyContainer } = require_util2(); var { forbiddenMethods, @@ -6989,7 +7024,11 @@ var require_request = __commonJS({ init = webidl.converters.RequestInit(init); this[kRealm] = { settingsObject: { - baseUrl: getGlobalOrigin() + baseUrl: getGlobalOrigin(), + get origin() { + return this.baseUrl?.origin; + }, + policyContainer: makePolicyContainer() } }; let request = null; @@ -7131,12 +7170,14 @@ var require_request = __commonJS({ if (signal.aborted) { ac.abort(signal.reason); } else { - const acRef = new WeakRef(ac); const abort = function() { - acRef.deref()?.abort(this.reason); + ac.abort(this.reason); }; - if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { - setMaxListeners(100, signal); + try { + if (getEventListeners(signal, "abort").length >= defaultMaxListeners) { + setMaxListeners(100, signal); + } + } catch { } signal.addEventListener("abort", abort, { once: true }); requestFinalizer.register(this, { signal, abort }); @@ -7900,12 +7941,14 @@ var require_timers = __commonJS({ let idx = 0; while (idx < len) { const timer = fastTimers[idx]; - if (timer.expires && fastNow >= timer.expires) { - timer.expires = 0; + if (timer.state === 0) { + timer.state = fastNow + timer.delay; + } else if (timer.state > 0 && fastNow >= timer.state) { + timer.state = -1; timer.callback(timer.opaque); } - if (timer.expires === 0) { - timer.active = false; + if (timer.state === -1) { + timer.state = -2; if (idx !== len - 1) { fastTimers[idx] = fastTimers.pop(); } else { @@ -7936,32 +7979,31 @@ var require_timers = __commonJS({ this.callback = callback; this.delay = delay; this.opaque = opaque; - this.expires = 0; - this.active = false; + this.state = -2; this.refresh(); } refresh() { - if (!this.active) { - this.active = true; + if (this.state === -2) { fastTimers.push(this); if (!fastNowTimeout || fastTimers.length === 1) { refreshTimeout(); - fastNow = Date.now(); } } - this.expires = fastNow + this.delay; + this.state = 0; } clear() { - this.expires = 0; + this.state = -1; } }; module2.exports = { setTimeout(callback, delay, opaque) { - return new Timeout(callback, delay, opaque); + return delay < 1e3 ? setTimeout(callback, delay, opaque) : new Timeout(callback, delay, opaque); }, clearTimeout(timeout) { - if (timeout && timeout.clear) { + if (timeout instanceof Timeout) { timeout.clear(); + } else { + clearTimeout(timeout); } } }; @@ -10140,6 +10182,7 @@ upgrade: ${upgrade}\r } process.emitWarning(new RequestContentLengthMismatchError()); } + socket.cork(); if (bytesWritten === 0) { if (!expectsPayload) { socket[kReset] = true; @@ -10160,6 +10203,7 @@ ${len.toString(16)}\r } this.bytesWritten += len; const ret = socket.write(chunk); + socket.uncork(); request.onBodySent(chunk); if (!ret) { if (socket[kParser].timeout && socket[kParser].timeoutType === TIMEOUT_HEADERS) { @@ -10627,7 +10671,7 @@ var require_fetch = __commonJS({ }); cacheState = ""; } - response.timingInfo.endTime = coarsenedSharedCurrentTime(); + timingInfo.endTime = coarsenedSharedCurrentTime(); response.timingInfo = timingInfo; markResourceTiming(timingInfo, originalURL, initiatorType, globalThis, cacheState); } |