diff --git a/Cargo.lock b/Cargo.lock index ef3fdaa6e8..736e06df7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -501,7 +501,7 @@ dependencies = [ [[package]] name = "deno_fetch" -version = "0.20.1" +version = "0.20.2" dependencies = [ "bytes", "deno_core", diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 9d4630de7c..45be23c8d8 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -25,7 +25,7 @@ path = "./bench/main.rs" [build-dependencies] deno_core = { path = "../core", version = "0.77.1" } -deno_fetch = { path = "../op_crates/fetch", version = "0.20.1" } +deno_fetch = { path = "../op_crates/fetch", version = "0.20.2" } deno_web = { path = "../op_crates/web", version = "0.28.1" } deno_websocket = { path = "../op_crates/websocket", version = "0.3.1" } regex = "1.4.3" diff --git a/op_crates/fetch/26_fetch.js b/op_crates/fetch/26_fetch.js index 52ae91e835..58e2cab85f 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); diff --git a/op_crates/fetch/Cargo.toml b/op_crates/fetch/Cargo.toml index 4e6cb309c2..a96775d716 100644 --- a/op_crates/fetch/Cargo.toml +++ b/op_crates/fetch/Cargo.toml @@ -2,7 +2,7 @@ [package] name = "deno_fetch" -version = "0.20.1" +version = "0.20.2" edition = "2018" description = "provides fetch Web API to deno_core" authors = ["the Deno authors"] diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index 9d0494709c..7c4c9cd54c 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -20,7 +20,7 @@ path = "examples/hello_runtime.rs" [build-dependencies] deno_core = { path = "../core", version = "0.77.1" } deno_crypto = { path = "../op_crates/crypto", version = "0.11.1" } -deno_fetch = { path = "../op_crates/fetch", version = "0.20.1" } +deno_fetch = { path = "../op_crates/fetch", version = "0.20.2" } deno_web = { path = "../op_crates/web", version = "0.28.1" } deno_websocket = { path = "../op_crates/websocket", version = "0.3.1" } @@ -31,7 +31,7 @@ winapi = "0.3.9" [dependencies] deno_core = { path = "../core", version = "0.77.1" } deno_crypto = { path = "../op_crates/crypto", version = "0.11.1" } -deno_fetch = { path = "../op_crates/fetch", version = "0.20.1" } +deno_fetch = { path = "../op_crates/fetch", version = "0.20.2" } deno_web = { path = "../op_crates/web", version = "0.28.1" } deno_websocket = { path = "../op_crates/websocket", version = "0.3.1" }