mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(fetch): set content-length for empty POST/PUT (#12703)
This commit changes `fetch` to set `content-length: 0` on POST and PUT requests with no body.
This commit is contained in:
parent
75793baae8
commit
0de6d1edc4
3 changed files with 68 additions and 1 deletions
|
@ -640,6 +640,7 @@ unitTest(
|
||||||
const actual = new TextDecoder().decode((await bufPromise).bytes());
|
const actual = new TextDecoder().decode((await bufPromise).bytes());
|
||||||
const expected = [
|
const expected = [
|
||||||
"POST /blah HTTP/1.1\r\n",
|
"POST /blah HTTP/1.1\r\n",
|
||||||
|
"content-length: 0\r\n",
|
||||||
"hello: World\r\n",
|
"hello: World\r\n",
|
||||||
"foo: Bar\r\n",
|
"foo: Bar\r\n",
|
||||||
"accept: */*\r\n",
|
"accept: */*\r\n",
|
||||||
|
@ -1416,3 +1417,60 @@ unitTest(
|
||||||
assertEquals(await res.text(), fixture);
|
assertEquals(await res.text(), fixture);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ permissions: { net: true } },
|
||||||
|
async function fetchContentLengthPost() {
|
||||||
|
const response = await fetch("http://localhost:4545/content_length", {
|
||||||
|
method: "POST",
|
||||||
|
});
|
||||||
|
const length = await response.text();
|
||||||
|
assertEquals(length, 'Some("0")');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ permissions: { net: true } },
|
||||||
|
async function fetchContentLengthPut() {
|
||||||
|
const response = await fetch("http://localhost:4545/content_length", {
|
||||||
|
method: "PUT",
|
||||||
|
});
|
||||||
|
const length = await response.text();
|
||||||
|
assertEquals(length, 'Some("0")');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ permissions: { net: true } },
|
||||||
|
async function fetchContentLengthPatch() {
|
||||||
|
const response = await fetch("http://localhost:4545/content_length", {
|
||||||
|
method: "PATCH",
|
||||||
|
});
|
||||||
|
const length = await response.text();
|
||||||
|
assertEquals(length, "None");
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ permissions: { net: true } },
|
||||||
|
async function fetchContentLengthPostWithStringBody() {
|
||||||
|
const response = await fetch("http://localhost:4545/content_length", {
|
||||||
|
method: "POST",
|
||||||
|
body: "Hey!",
|
||||||
|
});
|
||||||
|
const length = await response.text();
|
||||||
|
assertEquals(length, 'Some("4")');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
unitTest(
|
||||||
|
{ permissions: { net: true } },
|
||||||
|
async function fetchContentLengthPostWithBufferBody() {
|
||||||
|
const response = await fetch("http://localhost:4545/content_length", {
|
||||||
|
method: "POST",
|
||||||
|
body: new TextEncoder().encode("Hey!"),
|
||||||
|
});
|
||||||
|
const length = await response.text();
|
||||||
|
assertEquals(length, 'Some("4")');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
|
@ -246,7 +246,7 @@ where
|
||||||
let permissions = state.borrow_mut::<FP>();
|
let permissions = state.borrow_mut::<FP>();
|
||||||
permissions.check_net_url(&url)?;
|
permissions.check_net_url(&url)?;
|
||||||
|
|
||||||
let mut request = client.request(method, url);
|
let mut request = client.request(method.clone(), url);
|
||||||
|
|
||||||
let request_body_rid = if args.has_body {
|
let request_body_rid = if args.has_body {
|
||||||
match data {
|
match data {
|
||||||
|
@ -278,6 +278,11 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// POST and PUT requests should always have a 0 length content-length,
|
||||||
|
// if there is no body. https://fetch.spec.whatwg.org/#http-network-or-cache-fetch
|
||||||
|
if matches!(method, Method::POST | Method::PUT) {
|
||||||
|
request = request.header(CONTENT_LENGTH, HeaderValue::from(0));
|
||||||
|
}
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -851,6 +851,10 @@ async fn main_server(
|
||||||
let version = format!("{:?}", req.version());
|
let version = format!("{:?}", req.version());
|
||||||
Ok(Response::new(version.into()))
|
Ok(Response::new(version.into()))
|
||||||
}
|
}
|
||||||
|
(_, "/content_length") => {
|
||||||
|
let content_length = format!("{:?}", req.headers().get("content-length"));
|
||||||
|
Ok(Response::new(content_length.into()))
|
||||||
|
}
|
||||||
(_, "/jsx/jsx-runtime") | (_, "/jsx/jsx-dev-runtime") => {
|
(_, "/jsx/jsx-runtime") | (_, "/jsx/jsx-dev-runtime") => {
|
||||||
let mut res = Response::new(Body::from(
|
let mut res = Response::new(Body::from(
|
||||||
r#"export function jsx(
|
r#"export function jsx(
|
||||||
|
|
Loading…
Add table
Reference in a new issue