summaryrefslogtreecommitdiff
path: root/op_crates/fetch/26_fetch.js
diff options
context:
space:
mode:
Diffstat (limited to 'op_crates/fetch/26_fetch.js')
-rw-r--r--op_crates/fetch/26_fetch.js31
1 files changed, 27 insertions, 4 deletions
diff --git a/op_crates/fetch/26_fetch.js b/op_crates/fetch/26_fetch.js
index 52ae91e83..58e2cab85 100644
--- a/op_crates/fetch/26_fetch.js
+++ b/op_crates/fetch/26_fetch.js
@@ -682,6 +682,10 @@
const teeBody = Symbol("Body#tee");
+ // fastBody and dontValidateUrl allow users to opt out of certain behaviors
+ const fastBody = Symbol("Body#fast");
+ const dontValidateUrl = Symbol("dontValidateUrl");
+
class Body {
#contentType = "";
#size;
@@ -730,6 +734,17 @@
return this.#stream;
}
+ // Optimization that allows caller to bypass expensive ReadableStream.
+ [fastBody]() {
+ if (!this.#bodySource) {
+ return null;
+ } else if (!(this.#bodySource instanceof ReadableStream)) {
+ return bodyToArrayBuffer(this.#bodySource);
+ } else {
+ return this.body;
+ }
+ }
+
/** @returns {BodyInit | null} */
[teeBody]() {
if (this.#stream || this.#bodySource instanceof ReadableStream) {
@@ -991,10 +1006,16 @@
this.#headers = new Headers(input.headers);
this.#credentials = input.credentials;
} else {
- const baseUrl = getLocationHref();
- this.#url = baseUrl != null
- ? new URL(String(input), baseUrl).href
- : new URL(String(input)).href;
+ // Constructing a URL just for validation is known to be expensive.
+ // dontValidateUrl allows one to opt out.
+ if (init[dontValidateUrl]) {
+ this.#url = input;
+ } else {
+ const baseUrl = getLocationHref();
+ this.#url = baseUrl != null
+ ? new URL(String(input), baseUrl).href
+ : new URL(String(input)).href;
+ }
}
if (init && "method" in init && init.method) {
@@ -1477,5 +1498,7 @@
Response,
HttpClient,
createHttpClient,
+ fastBody,
+ dontValidateUrl,
};
})(this);