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:
parent
bbcb144a6d
commit
d4e5a295f2
2 changed files with 5 additions and 3 deletions
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue