summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Casonato <hello@lcas.dev>2021-07-22 14:28:55 +0200
committerGitHub <noreply@github.com>2021-07-22 14:28:55 +0200
commit8b34f07bb000a16b60b119ee24f5c0b4a5f7f937 (patch)
tree721fb932ddaee01059146048b8347d18ce710859
parent4861b13aabd61d2df600e79a2e621fa1f3b870c3 (diff)
fix(http/ws): case insensitive connection header (#11489)
The "connection" header should be case insensitive: https://datatracker.ietf.org/doc/html/rfc7230#section-6.1
-rw-r--r--cli/tests/unit/http_test.ts32
-rw-r--r--extensions/http/01_http.js2
2 files changed, 32 insertions, 2 deletions
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts
index bf351cd48..f9a44d8ef 100644
--- a/cli/tests/unit/http_test.ts
+++ b/cli/tests/unit/http_test.ts
@@ -642,7 +642,7 @@ unitTest({ perms: { net: true } }, async function httpServerWebSocket() {
const {
response,
websocket,
- } = await Deno.upgradeWebSocket(request);
+ } = Deno.upgradeWebSocket(request);
websocket.onerror = () => fail();
websocket.onmessage = (m) => {
websocket.send(m.data);
@@ -663,6 +663,36 @@ unitTest({ perms: { net: true } }, async function httpServerWebSocket() {
await promise;
});
+unitTest(function httpUpgradeWebSocket() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "Upgrade",
+ upgrade: "websocket",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+ assertEquals(response.headers.get("connection"), "Upgrade");
+ assertEquals(response.headers.get("upgrade"), "websocket");
+ assertEquals(
+ response.headers.get("sec-websocket-accept"),
+ "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",
+ );
+});
+
+unitTest(function httpUpgradeWebSocketLowercaseUpgradeHeader() {
+ const request = new Request("https://deno.land/", {
+ headers: {
+ connection: "upgrade",
+ upgrade: "websocket",
+ "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==",
+ },
+ });
+ const { response } = Deno.upgradeWebSocket(request);
+ assertEquals(response.status, 101);
+});
+
unitTest({ perms: { net: true } }, async function httpCookieConcatenation() {
const promise = (async () => {
const listener = Deno.listen({ port: 4501 });
diff --git a/extensions/http/01_http.js b/extensions/http/01_http.js
index 4bcdf1f07..e0f221ce0 100644
--- a/extensions/http/01_http.js
+++ b/extensions/http/01_http.js
@@ -321,7 +321,7 @@
);
}
- if (request.headers.get("connection") !== "Upgrade") {
+ if (request.headers.get("connection")?.toLowerCase() !== "upgrade") {
throw new TypeError(
"Invalid Header: 'connection' header must be 'Upgrade'",
);