diff --git a/cli/tests/unit/fetch_test.ts b/cli/tests/unit/fetch_test.ts index c2224083dc..cf7510ea2c 100644 --- a/cli/tests/unit/fetch_test.ts +++ b/cli/tests/unit/fetch_test.ts @@ -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); + }, +); diff --git a/extensions/fetch/lib.rs b/extensions/fetch/lib.rs index 3652c87240..714fc43c70 100644 --- a/extensions/fetch/lib.rs +++ b/extensions/fetch/lib.rs @@ -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();