From 8594bc81b3f014200b92297dd4e57c168172ce45 Mon Sep 17 00:00:00 2001 From: PoleTransformer Date: Wed, 31 Dec 2025 09:51:49 -0800 Subject: [PATCH] Enforce backend WS timeout + subprotocol logic + formatting --- server/monitor-types/websocket-upgrade.js | 7 ++++--- src/pages/EditMonitor.vue | 2 +- test/backend-test/test-websocket.js | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/server/monitor-types/websocket-upgrade.js b/server/monitor-types/websocket-upgrade.js index 4adb1f1e5..32c7c15da 100644 --- a/server/monitor-types/websocket-upgrade.js +++ b/server/monitor-types/websocket-upgrade.js @@ -36,7 +36,7 @@ class WebSocketMonitorType extends MonitorType { if (checkStatusCode(code, JSON.parse(monitor.accepted_statuscodes_json))) { heartbeat.status = UP; heartbeat.msg = message; - return; //success at this point + return; // success at this point } // Throw an error using friendly name if defined, fallback to generic msg @@ -57,9 +57,10 @@ class WebSocketMonitorType extends MonitorType { */ async attemptUpgrade(monitor) { return new Promise((resolve) => { - let ws; + const timeoutMs = (monitor.timeout ?? 20) * 1000; // If user inputs subprotocol(s), convert to array, set Sec-WebSocket-Protocol header, timeout in ms. Subprotocol Identifier column: https://www.iana.org/assignments/websocket/websocket.xml#subprotocol-name - ws = !monitor.wsSubprotocol ? new WebSocket(monitor.url, { handshakeTimeout: (monitor?.timeout ?? 0) * 1000 }) : new WebSocket(monitor.url, monitor.wsSubprotocol.replace(/\s/g, "").split(","), { handshakeTimeout: (monitor?.timeout ?? 0) * 1000 }); + const subprotocol = monitor.wsSubprotocol ? monitor.wsSubprotocol.replace(/\s/g, "").split(",") : undefined; + const ws = new WebSocket(monitor.url, subprotocol, { handshakeTimeout: timeoutMs }); ws.addEventListener("open", (event) => { // Immediately close the connection diff --git a/src/pages/EditMonitor.vue b/src/pages/EditMonitor.vue index 6236a0b42..8c192a630 100644 --- a/src/pages/EditMonitor.vue +++ b/src/pages/EditMonitor.vue @@ -848,7 +848,7 @@ diff --git a/test/backend-test/test-websocket.js b/test/backend-test/test-websocket.js index ed12c2a1e..3eeeb3243 100644 --- a/test/backend-test/test-websocket.js +++ b/test/backend-test/test-websocket.js @@ -230,7 +230,7 @@ describe("Websocket Test", { ); }); - test("Secure WS no support one subprotocol", async () => { + test("Secure WS no subprotocol support", async () => { const websocketMonitor = new WebSocketMonitorType(); const monitor = { @@ -305,7 +305,7 @@ describe("Websocket Test", { assert.deepStrictEqual(heartbeat, expected); }); - test("Insecure WS support one subprotocol", async (t) => { + test("Insecure WS supports one subprotocol", async (t) => { t.after(() => wss.close()); const websocketMonitor = new WebSocketMonitorType(); const wss = new WebSocketServer({ port: 8080,