mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(ext/fetch): ignore user content-length header (#15555)
Previously if a user specified a content-length header for an POST request without a body, the request would contain two `content-length` headers. One added by us, and one added by the user. This commit ignores all content-length headers coming from the user, because we need to have the sole authority on the content-length because we transmit the body.
This commit is contained in:
parent
ecf3b51fd9
commit
24f7f3fda9
2 changed files with 63 additions and 1 deletions
|
@ -760,6 +760,68 @@ Deno.test(
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
{
|
||||||
|
permissions: { net: true },
|
||||||
|
},
|
||||||
|
async function fetchUserSetContentLength() {
|
||||||
|
const addr = "127.0.0.1:4501";
|
||||||
|
const bufPromise = bufferServer(addr);
|
||||||
|
const response = await fetch(`http://${addr}/blah`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: [
|
||||||
|
["Content-Length", "10"],
|
||||||
|
],
|
||||||
|
});
|
||||||
|
await response.arrayBuffer();
|
||||||
|
assertEquals(response.status, 404);
|
||||||
|
assertEquals(response.headers.get("Content-Length"), "2");
|
||||||
|
|
||||||
|
const actual = new TextDecoder().decode((await bufPromise).bytes());
|
||||||
|
const expected = [
|
||||||
|
"POST /blah HTTP/1.1\r\n",
|
||||||
|
"content-length: 0\r\n",
|
||||||
|
"accept: */*\r\n",
|
||||||
|
"accept-language: *\r\n",
|
||||||
|
`user-agent: Deno/${Deno.version.deno}\r\n`,
|
||||||
|
"accept-encoding: gzip, br\r\n",
|
||||||
|
`host: ${addr}\r\n\r\n`,
|
||||||
|
].join("");
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
Deno.test(
|
||||||
|
{
|
||||||
|
permissions: { net: true },
|
||||||
|
},
|
||||||
|
async function fetchUserSetTransferEncoding() {
|
||||||
|
const addr = "127.0.0.1:4501";
|
||||||
|
const bufPromise = bufferServer(addr);
|
||||||
|
const response = await fetch(`http://${addr}/blah`, {
|
||||||
|
method: "POST",
|
||||||
|
headers: [
|
||||||
|
["Transfer-Encoding", "chunked"],
|
||||||
|
],
|
||||||
|
});
|
||||||
|
await response.arrayBuffer();
|
||||||
|
assertEquals(response.status, 404);
|
||||||
|
assertEquals(response.headers.get("Content-Length"), "2");
|
||||||
|
|
||||||
|
const actual = new TextDecoder().decode((await bufPromise).bytes());
|
||||||
|
const expected = [
|
||||||
|
"POST /blah HTTP/1.1\r\n",
|
||||||
|
"content-length: 0\r\n",
|
||||||
|
`host: ${addr}\r\n`,
|
||||||
|
"accept: */*\r\n",
|
||||||
|
"accept-language: *\r\n",
|
||||||
|
`user-agent: Deno/${Deno.version.deno}\r\n`,
|
||||||
|
"accept-encoding: gzip, br\r\n\r\n",
|
||||||
|
].join("");
|
||||||
|
assertEquals(actual, expected);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
Deno.test(
|
Deno.test(
|
||||||
{
|
{
|
||||||
permissions: { net: true },
|
permissions: { net: true },
|
||||||
|
|
|
@ -287,7 +287,7 @@ where
|
||||||
.map_err(|err| type_error(err.to_string()))?;
|
.map_err(|err| type_error(err.to_string()))?;
|
||||||
let v = HeaderValue::from_bytes(&value)
|
let v = HeaderValue::from_bytes(&value)
|
||||||
.map_err(|err| type_error(err.to_string()))?;
|
.map_err(|err| type_error(err.to_string()))?;
|
||||||
if name != HOST {
|
if !matches!(name, HOST | CONTENT_LENGTH) {
|
||||||
request = request.header(name, v);
|
request = request.header(name, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue