From 2dfed1b7fbf19e5e874340340f764a90252b5537 Mon Sep 17 00:00:00 2001 From: EuAndreh Date: Sat, 16 Mar 2024 08:14:27 -0300 Subject: src/hero.mjs: Add makeUpgradeListener() (again, now rewritten) --- tests/js/hero.mjs | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'tests/js') diff --git a/tests/js/hero.mjs b/tests/js/hero.mjs index ed876e7..a5166c5 100644 --- a/tests/js/hero.mjs +++ b/tests/js/hero.mjs @@ -40,6 +40,7 @@ import { handle404, make404Handler, handleRequest, + makeUpgradeListener, makeRequestListener, actionsFn, lineHandlerFn, @@ -1556,6 +1557,83 @@ const test_handleRequest = async t => { }); }; +const test_makeUpgradeListener = async t => { + t.start("makeUpgradeListener()"); + + await t.test("straightforward connection stablishing", async () => { + const calls = []; + const fn = x => calls.push([x.upgrade, x.socket]); + const routes = [[ "WEBSOCKET", "/socket", fn ]]; + const table = buildRoutes(routes, [ + interceptors.contentType, + interceptors.websocketHandshake, + ]); + const upgradeListener = makeUpgradeListener(table); + + const req = { + method: "GET", + url: "/socket", + upgrade: true, + headers: { + "upgrade": "websocket", + "sec-websocket-key": "aaaaabbbbbcccccdddddee==", + "sec-websocket-version": "13", + }, + }; + + const contents = []; + const socket = { + end: () => assert.ok(false), + write: x => contents.push(x), + }; + await upgradeListener(req, socket); + + assert.deepEqual(calls, [[true, socket]]); + assert.deepEqual(contents, [ + "HTTP/1.1 101 Switching Protocols\r\n" + + "Connection: Upgrade\r\n" + + "Content-Length: 20\r\n" + + "Content-Type: text/plain\r\n" + + "Sec-WebSocket-Accept: eHnDP9gUz224y002aFCe7swigxg=\r\n" + + "Upgrade: websocket\r\n" + + "\r\n", + "Switching Protocols\n", + ]); + }); + + await t.test("early termination cases", async () => { + const routes = [[ "WEBSOCKET", "/a-socket", null ]]; + const table = buildRoutes(routes, [ + interceptors.websocketHandshake, + ]); + const upgradeListener = makeUpgradeListener(table); + + const req = { + method: "GET", + url: "/a-socket", + upgrade: true, + headers: { + "upgrade": "websocket", + }, + }; + + let ended = false; + const contents = []; + const socket = { + end: () => ended = true, + write: x => contents.push(x), + }; + + await upgradeListener(req, socket); + + assert.ok(ended); + assert.deepEqual(contents, [ + "HTTP/1.1 400 Bad Request\r\n\r\n", + 'Missing "Sec-WebSocket-Key" header\n', + ]); + }); +}; + const test_makeRequestListener = async t => { t.start("makeRequestListener()"); @@ -2258,6 +2336,7 @@ await runner.runTests([ test_writeHead, test_make404Handler, test_handleRequest, + test_makeUpgradeListener, test_makeRequestListener, test_actionsFn, test_lineHandlerFn, -- cgit v1.2.3