From df9776c04e70a2ff57caec6c216a2150e25b7690 Mon Sep 17 00:00:00 2001 From: Samuel Merritt Date: Wed, 28 Jun 2023 12:56:26 -0700 Subject: [PATCH] WebSockets: don't set outgoingAborted if outgoing is closed If the WebSocket is already closed for writes, there's no need to set outgoingAborted because there can be no more outgoing traffic. This was showing up on protocol errors: the script would get an error event describing what their WebSocket client said wrong (good), and then a second error event complaining about a disconnect (bad). --- src/workerd/api/web-socket.c++ | 6 ++++-- src/workerd/server/server-test.c++ | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/workerd/api/web-socket.c++ b/src/workerd/api/web-socket.c++ index 3f36fde18678..8c661d718537 100644 --- a/src/workerd/api/web-socket.c++ +++ b/src/workerd/api/web-socket.c++ @@ -450,8 +450,10 @@ kj::Promise WebSocket::Accepted::createAbortTask(Native& native, IoContext LOG_EXCEPTION("webSocketWhenAborted", e); } }).then([this, &native]() { - // Other end disconnected prematurely. We may be able to clean up our state. - native.outgoingAborted = true; + if (!native.closedOutgoing) { + // Other end disconnected prematurely. We may be able to clean up our state. + native.outgoingAborted = true; + } if (!native.isPumping && native.closedIncoming) { // We can safely destroy the underlying WebSocket as it is no longer in use. // HACK: Replacing the state will delete `whenAbortedTask`, which is the task that is diff --git a/src/workerd/server/server-test.c++ b/src/workerd/server/server-test.c++ index 3495a9fe12f6..a05d2412fcb6 100644 --- a/src/workerd/server/server-test.c++ +++ b/src/workerd/server/server-test.c++ @@ -651,6 +651,8 @@ KJ_TEST("Server: test WebSocket errors: bad RSV bits") { ` server.addEventListener('message', (event) => { ` if (event.data === "getErrors") { ` server.send(JSON.stringify(errors)) + ` } else if (event.data === "getErrorCount") { + ` server.send(errors.length.toString()) ` } else { ` server.send(event.data); // echo ` } @@ -676,6 +678,8 @@ KJ_TEST("Server: test WebSocket errors: bad RSV bits") { auto errWsConn = test.connect("test-addr"); errWsConn.upgradeToWebSocket(); + errWsConn.send("\x81\x0dgetErrorCount"); + errWsConn.recvWebSocketRegex("1"); errWsConn.send("\x81\x09getErrors"); errWsConn.recvWebSocketRegex(".*RSV bits.*"); }