From 8bab761bccf976ac568b0b3f4decfd7e77747767 Mon Sep 17 00:00:00 2001 From: Satya Rohith Date: Mon, 29 Jul 2024 17:03:55 +0530 Subject: [PATCH] fix(ext/node): prevent panic in http2.connect with uppercase header names (#24780) Closes https://github.com/denoland/deno/issues/24678 --- ext/node/ops/http2.rs | 4 ++-- tests/unit_node/http2_test.ts | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/ext/node/ops/http2.rs b/ext/node/ops/http2.rs index a13985f5ab5386..9595cb33d6abfc 100644 --- a/ext/node/ops/http2.rs +++ b/ext/node/ops/http2.rs @@ -247,7 +247,7 @@ pub async fn op_http2_send_response( } for (name, value) in headers { response.headers_mut().append( - HeaderName::from_lowercase(&name).unwrap(), + HeaderName::from_bytes(&name).unwrap(), HeaderValue::from_bytes(&value).unwrap(), ); } @@ -317,7 +317,7 @@ pub async fn op_http2_client_request( for (name, value) in headers { req.headers_mut().unwrap().append( - HeaderName::from_lowercase(&name).unwrap(), + HeaderName::from_bytes(&name).unwrap(), HeaderValue::from_bytes(&value).unwrap(), ); } diff --git a/tests/unit_node/http2_test.ts b/tests/unit_node/http2_test.ts index 67c2497d5ff969..edaac8234228be 100644 --- a/tests/unit_node/http2_test.ts +++ b/tests/unit_node/http2_test.ts @@ -243,3 +243,35 @@ Deno.test("[node/http2 client] write 512kb buffer on request stream works", asyn await endPromise.promise; assertEquals(receivedData!, buffer); }); + +// https://github.com/denoland/deno/issues/24678 +Deno.test("[node/http2 client] deno doesn't panic on uppercase headers", async () => { + const url = "http://127.0.0.1:4246"; + const client = http2.connect(url); + client.on("error", (err) => console.error(err)); + + // The "User-Agent" header has uppercase characters to test the panic. + const req = client.request({ + ":method": "POST", + ":path": "/", + "User-Agent": "http2", + }); + const endPromise = Promise.withResolvers(); + + let receivedData = ""; + + req.write("hello"); + req.setEncoding("utf8"); + + req.on("data", (chunk) => { + receivedData += chunk; + }); + req.on("end", () => { + req.close(); + client.close(); + endPromise.resolve(); + }); + req.end(); + await endPromise.promise; + assertEquals(receivedData, "hello world\n"); +});