diff options
-rw-r--r-- | cli/tests/unit/http_test.ts | 46 | ||||
-rw-r--r-- | ext/http/01_http.js | 3 |
2 files changed, 48 insertions, 1 deletions
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts index 0642a6d67..201ca1269 100644 --- a/cli/tests/unit/http_test.ts +++ b/cli/tests/unit/http_test.ts @@ -6,6 +6,7 @@ import { TextProtoReader } from "../../../test_util/std/textproto/mod.ts"; import { assert, assertEquals, + assertThrows, assertThrowsAsync, deferred, delay, @@ -705,6 +706,51 @@ unitTest(function httpUpgradeWebSocketMultipleConnectionOptions() { assertEquals(response.status, 101); }); +unitTest(function httpUpgradeWebSocketCaseInsensitiveUpgradeHeader() { + 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(function httpUpgradeWebSocketInvalidUpgradeHeader() { + assertThrows( + () => { + const request = new Request("https://deno.land/", { + headers: { + connection: "upgrade", + upgrade: "invalid", + "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", + }, + }); + Deno.upgradeWebSocket(request); + }, + TypeError, + "Invalid Header: 'upgrade' header must be 'websocket'", + ); +}); + +unitTest(function httpUpgradeWebSocketWithoutUpgradeHeader() { + assertThrows( + () => { + const request = new Request("https://deno.land/", { + headers: { + connection: "upgrade", + "sec-websocket-key": "dGhlIHNhbXBsZSBub25jZQ==", + }, + }); + Deno.upgradeWebSocket(request); + }, + TypeError, + "Invalid Header: 'upgrade' header must be 'websocket'", + ); +}); + unitTest({ perms: { net: true } }, async function httpCookieConcatenation() { const promise = (async () => { const listener = Deno.listen({ port: 4501 }); diff --git a/ext/http/01_http.js b/ext/http/01_http.js index b14a0d352..073cc7a7c 100644 --- a/ext/http/01_http.js +++ b/ext/http/01_http.js @@ -341,7 +341,8 @@ const _ws = Symbol("[[associated_ws]]"); function upgradeWebSocket(request, options = {}) { - if (request.headers.get("upgrade") !== "websocket") { + const upgrade = request.headers.get("upgrade"); + if (!upgrade || StringPrototypeToLowerCase(upgrade) !== "websocket") { throw new TypeError( "Invalid Header: 'upgrade' header must be 'websocket'", ); |