0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-03 09:31:22 -05:00

fix(extensions/fetch): Filter out custom HOST headers (#11020)

This commit updates "fetch" API to ignore custom "Host" headers
and return value provided by "reqwest".
This commit is contained in:
Vladimir Ivanov 2021-06-22 06:42:04 +03:00 committed by GitHub
parent 4f1b1903cf
commit cd59601b34
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 1 deletions

View file

@ -1149,3 +1149,49 @@ unitTest({}, function fetchWritableRespProps(): void {
assertEquals(original.status, new_.status);
assertEquals(new_.headers.get("x-deno"), "foo");
});
function returnHostHeaderServer(addr: string): Deno.Listener {
const [hostname, port] = addr.split(":");
const listener = Deno.listen({
hostname,
port: Number(port),
}) as Deno.Listener;
listener.accept().then(async (conn: Deno.Conn) => {
const httpConn = Deno.serveHttp(conn);
await httpConn.nextRequest()
.then(async (requestEvent: Deno.RequestEvent | null) => {
const hostHeader = requestEvent?.request.headers.get("Host");
const headersToReturn = hostHeader ? { "Host": hostHeader } : undefined;
await requestEvent?.respondWith(
new Response("", {
status: 200,
headers: headersToReturn,
}),
);
});
httpConn.close();
});
return listener;
}
unitTest(
{ perms: { net: true } },
async function fetchFilterOutCustomHostHeader(): Promise<
void
> {
const addr = "127.0.0.1:4502";
const listener = returnHostHeaderServer(addr);
const response = await fetch(`http://${addr}/`, {
headers: { "Host": "example.com" },
});
await response.text();
listener.close();
assertEquals(response.headers.get("Host"), addr);
},
);

View file

@ -29,6 +29,7 @@ use deno_web::BlobUrlStore;
use reqwest::header::HeaderMap;
use reqwest::header::HeaderName;
use reqwest::header::HeaderValue;
use reqwest::header::HOST;
use reqwest::header::USER_AGENT;
use reqwest::redirect::Policy;
use reqwest::Body;
@ -197,7 +198,9 @@ where
for (key, value) in args.headers {
let name = HeaderName::from_bytes(key.as_bytes()).unwrap();
let v = HeaderValue::from_str(&value).unwrap();
request = request.header(name, v);
if name != HOST {
request = request.header(name, v);
}
}
let cancel_handle = CancelHandle::new_rc();