diff options
author | Kamil Ogórek <kamil.ogorek@gmail.com> | 2023-02-12 11:43:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-12 16:13:05 +0530 |
commit | d4e5a295f2f9af1f815596656a185b11d7dabb29 (patch) | |
tree | 79bccb5401460ca84ea55bef9cc1348c956b5d4e | |
parent | bbcb144a6d8360a5ff0878d738d151bad9a948e7 (diff) |
fix(ext/flash): Always send correct number of bytes when handling HEAD requests (#17740)
This was not caught in the previous test case, as the response body was
smaller than the size of `HEAD` response.
This made `nwritten < responseLen` check in `writeFixedResponse` to
fail, and not trigger `op_flash_respond_async` as a result.
When the response body is larger than the `HEAD` though, as in the
updated test case (`HEAD` i 120 bytes, where our response is 300 bytes),
it would think that we still have something to send, and effectively
panic, as `op_flash_respond` already removed the request from the pool.
This change, makes the `handleResponse` function always calculate the
number of bytes to transmit when `HEAD` request is encountered.
Effectively ignoring `Content-Length` of the body, but still setting it
correctly in the request header itself.
Fixes https://github.com/denoland/deno/issues/17737
-rw-r--r-- | cli/tests/unit/flash_test.ts | 4 | ||||
-rw-r--r-- | ext/flash/01_http.js | 4 |
2 files changed, 5 insertions, 3 deletions
diff --git a/cli/tests/unit/flash_test.ts b/cli/tests/unit/flash_test.ts index 98249385b..9ed0276a6 100644 --- a/cli/tests/unit/flash_test.ts +++ b/cli/tests/unit/flash_test.ts @@ -1701,7 +1701,7 @@ Deno.test( const server = Deno.serve({ handler: () => { promise.resolve(); - return new Response("foo bar baz"); + return new Response("NaN".repeat(100)); }, port: 4503, signal: ac.signal, @@ -1726,7 +1726,7 @@ Deno.test( assert(readResult); const msg = decoder.decode(buf.subarray(0, readResult)); - assert(msg.endsWith("Content-Length: 11\r\n\r\n")); + assert(msg.endsWith("Content-Length: 300\r\n\r\n")); conn.close(); diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js index 34b158e40..5152fd9e5 100644 --- a/ext/flash/01_http.js +++ b/ext/flash/01_http.js @@ -316,11 +316,13 @@ async function handleResponse( respBody, length, ); + // A HEAD request always ignores body, but includes the correct content-length size. + const responseLen = method === 1 ? core.byteLength(responseStr) : length; writeFixedResponse( serverId, i, responseStr, - length, + responseLen, !ws, // Don't close socket if there is a deferred websocket upgrade. respondFast, ); |