From f546f51698636e629f3c314cd73e2cf4f176b330 Mon Sep 17 00:00:00 2001 From: Leo K Date: Mon, 9 Aug 2021 10:45:59 +0200 Subject: [PATCH] fix(websocket): allow any close code for server (#11614) --- cli/tests/unit/http_test.ts | 2 +- extensions/http/01_http.js | 3 ++- extensions/websocket/01_websocket.js | 19 ++++++++++++------- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts index ffd29ff86f..4cdd849026 100644 --- a/cli/tests/unit/http_test.ts +++ b/cli/tests/unit/http_test.ts @@ -646,7 +646,7 @@ unitTest({ perms: { net: true } }, async function httpServerWebSocket() { socket.onerror = () => fail(); socket.onmessage = (m) => { socket.send(m.data); - socket.close(); + socket.close(1001); }; await respondWith(response); break; diff --git a/extensions/http/01_http.js b/extensions/http/01_http.js index b245383d8f..3f8bcb3a8b 100644 --- a/extensions/http/01_http.js +++ b/extensions/http/01_http.js @@ -17,7 +17,7 @@ const { BadResource, Interrupted } = core; const { ReadableStream } = window.__bootstrap.streams; const abortSignal = window.__bootstrap.abortSignal; - const { WebSocket, _rid, _readyState, _eventLoop, _protocol } = + const { WebSocket, _rid, _readyState, _eventLoop, _protocol, _server } = window.__bootstrap.webSocket; const { ArrayPrototypeIncludes, @@ -370,6 +370,7 @@ const socket = webidl.createBranded(WebSocket); setEventTargetData(socket); + socket[_server] = true; response[_ws] = socket; return { response, socket }; diff --git a/extensions/websocket/01_websocket.js b/extensions/websocket/01_websocket.js index 7caff579e7..7af7951975 100644 --- a/extensions/websocket/01_websocket.js +++ b/extensions/websocket/01_websocket.js @@ -125,6 +125,7 @@ const _binaryType = Symbol("[[binaryType]]"); const _bufferedAmount = Symbol("[[bufferedAmount]]"); const _eventLoop = Symbol("[[eventLoop]]"); + const _server = Symbol("[[server]]"); class WebSocket extends EventTarget { [_rid]; @@ -387,13 +388,16 @@ }); } - if ( - code !== undefined && !(code === 1000 || (3000 <= code && code < 5000)) - ) { - throw new DOMException( - "The close code must be either 1000 or in the range of 3000 to 4999.", - "InvalidAccessError", - ); + if (!this[_server]) { + if ( + code !== undefined && + !(code === 1000 || (3000 <= code && code < 5000)) + ) { + throw new DOMException( + "The close code must be either 1000 or in the range of 3000 to 4999.", + "InvalidAccessError", + ); + } } if (reason !== undefined && core.encode(reason).byteLength > 123) { @@ -525,5 +529,6 @@ _readyState, _eventLoop, _protocol, + _server, }; })(this);