From 3cb260ed15a26785272bb09427504a565010963d Mon Sep 17 00:00:00 2001 From: Felipe Baltor Date: Sun, 30 Jul 2023 10:13:28 -0300 Subject: fix(Deno.serve): accessing .url on cloned request throws (#19869) This PR fixes #19818. The problem was that the new InnerRequest class does not initialize the fields urlList and urlListProcessed that are used during a request clone. The solution aims to be straightforward by simply initializing the missing properties during the clone process. I also implemented a "cache" to the url getter of the new InnerRequest, avoiding the cost of calling op_http_get_request_method_and_url. --- ext/http/00_serve.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'ext/http') diff --git a/ext/http/00_serve.js b/ext/http/00_serve.js index e881cca2a..b51dfee07 100644 --- a/ext/http/00_serve.js +++ b/ext/http/00_serve.js @@ -129,6 +129,7 @@ class InnerRequest { #streamRid; #body; #upgraded; + #urlValue; constructor(slabId, context) { this.#slabId = slabId; @@ -236,6 +237,10 @@ class InnerRequest { } url() { + if (this.#urlValue !== undefined) { + return this.#urlValue; + } + if (this.#methodAndUri === undefined) { if (this.#slabId === undefined) { throw new TypeError("request closed"); @@ -249,27 +254,28 @@ class InnerRequest { // * is valid for OPTIONS if (path === "*") { - return "*"; + return this.#urlValue = "*"; } // If the path is empty, return the authority (valid for CONNECT) if (path == "") { - return this.#methodAndUri[1]; + return this.#urlValue = this.#methodAndUri[1]; } // CONNECT requires an authority if (this.#methodAndUri[0] == "CONNECT") { - return this.#methodAndUri[1]; + return this.#urlValue = this.#methodAndUri[1]; } const hostname = this.#methodAndUri[1]; if (hostname) { // Construct a URL from the scheme, the hostname, and the path - return this.#context.scheme + hostname + path; + return this.#urlValue = this.#context.scheme + hostname + path; } // Construct a URL from the scheme, the fallback hostname, and the path - return this.#context.scheme + this.#context.fallbackHost + path; + return this.#urlValue = this.#context.scheme + this.#context.fallbackHost + + path; } get remoteAddr() { -- cgit v1.2.3