diff options
author | Felipe Baltor <fbaltor@gmail.com> | 2023-07-30 10:13:28 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-30 09:13:28 -0400 |
commit | 3cb260ed15a26785272bb09427504a565010963d (patch) | |
tree | cc29322017d235d3d56c75240eab1ce9f1f8be76 /ext/http/00_serve.js | |
parent | cfdef0c38038e42a4ac40f6e962c5e40a0c5cbe6 (diff) |
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.
Diffstat (limited to 'ext/http/00_serve.js')
-rw-r--r-- | ext/http/00_serve.js | 16 |
1 files changed, 11 insertions, 5 deletions
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() { |