Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 6c69497

Browse files
committed
Ensure WebSocket response headers normalised before restricting
1 parent dc54e05 commit 6c69497

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

packages/http-server/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -354,7 +354,7 @@ export async function createServer<Plugins extends HTTPPluginSignatures>(
354354
extraHeaders.delete(req);
355355
if (extra) {
356356
for (const [key, value] of extra) {
357-
if (!restrictedWebSocketUpgradeHeaders.includes(key)) {
357+
if (!restrictedWebSocketUpgradeHeaders.includes(key.toLowerCase())) {
358358
headers.push(`${key}: ${value}`);
359359
}
360360
}

packages/http-server/test/index.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,11 @@ test("createServer: includes headers from web socket upgrade response", async (t
609609
return new globals.Response(null, {
610610
status: 101,
611611
webSocket: client,
612-
headers: { "Set-Cookie": "key=value" },
612+
headers: {
613+
"Set-Cookie": "key=value",
614+
Connection: "close", // This header should be ignored
615+
"SeC-WebSoCKet-aCCePt": ":(", // ...as should this
616+
},
613617
});
614618
}
615619
);
@@ -619,6 +623,9 @@ test("createServer: includes headers from web socket upgrade response", async (t
619623
const [trigger, promise] = triggerPromise<http.IncomingMessage>();
620624
ws.addListener("upgrade", (req) => trigger(req));
621625
const req = await promise;
626+
t.is(req.headers.connection, "Upgrade");
627+
t.not(req.headers["sec-websocket-accept"], undefined);
628+
t.not(req.headers["sec-websocket-accept"], ":(");
622629
t.deepEqual(req.headers["set-cookie"], ["key=value"]);
623630
});
624631
test("createServer: expects status 101 and web socket response for upgrades", async (t) => {

0 commit comments

Comments
 (0)