1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-23 15:49:44 -05:00

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
This commit is contained in:
Kamil Ogórek 2023-02-12 11:43:05 +01:00 committed by GitHub
parent bbcb144a6d
commit d4e5a295f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 5 additions and 3 deletions

View file

@ -1701,7 +1701,7 @@ Deno.test(
const server = Deno.serve({ const server = Deno.serve({
handler: () => { handler: () => {
promise.resolve(); promise.resolve();
return new Response("foo bar baz"); return new Response("NaN".repeat(100));
}, },
port: 4503, port: 4503,
signal: ac.signal, signal: ac.signal,
@ -1726,7 +1726,7 @@ Deno.test(
assert(readResult); assert(readResult);
const msg = decoder.decode(buf.subarray(0, 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(); conn.close();

View file

@ -316,11 +316,13 @@ async function handleResponse(
respBody, respBody,
length, length,
); );
// A HEAD request always ignores body, but includes the correct content-length size.
const responseLen = method === 1 ? core.byteLength(responseStr) : length;
writeFixedResponse( writeFixedResponse(
serverId, serverId,
i, i,
responseStr, responseStr,
length, responseLen,
!ws, // Don't close socket if there is a deferred websocket upgrade. !ws, // Don't close socket if there is a deferred websocket upgrade.
respondFast, respondFast,
); );