From 57f26629f9895200bdc0d8cca1a73410db8e1a9f Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Fri, 2 Aug 2024 17:32:53 +0200 Subject: [PATCH] Emit more telling 1006 close events --- src/WebSocketContext.h | 4 ++-- src/WebSocketProtocol.h | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/WebSocketContext.h b/src/WebSocketContext.h index ad93a2472..8b8b418b9 100644 --- a/src/WebSocketContext.h +++ b/src/WebSocketContext.h @@ -371,11 +371,11 @@ struct WebSocketContext { return s; }); - /* Handle FIN, HTTP does not support half-closed sockets, so simply close */ + /* Handle FIN, WebSocket does not support half-closed sockets, so simply close */ us_socket_context_on_end(SSL, getSocketContext(), [](auto *s) { /* If we get a fin, we just close I guess */ - us_socket_close(SSL, (us_socket_t *) s, 0, nullptr); + us_socket_close(SSL, (us_socket_t *) s, (int) ERR_TCP_FIN.length(), (void *) ERR_TCP_FIN.data()); return s; }); diff --git a/src/WebSocketProtocol.h b/src/WebSocketProtocol.h index 00c580794..a37120d29 100644 --- a/src/WebSocketProtocol.h +++ b/src/WebSocketProtocol.h @@ -33,6 +33,8 @@ const std::string_view ERR_WEBSOCKET_TIMEOUT("WebSocket timed out from inactivit const std::string_view ERR_INVALID_TEXT("Received invalid UTF-8"); const std::string_view ERR_TOO_BIG_MESSAGE_INFLATION("Received too big message, or other inflation error"); const std::string_view ERR_INVALID_CLOSE_PAYLOAD("Received invalid close payload"); +const std::string_view ERR_PROTOCOL("Received invalid WebSocket frame"); +const std::string_view ERR_TCP_FIN("Received TCP FIN before WebSocket close frame"); enum OpCode : unsigned char { CONTINUATION = 0, @@ -341,12 +343,12 @@ struct WebSocketProtocol { static inline bool consumeMessage(T payLength, char *&src, unsigned int &length, WebSocketState *wState, void *user) { if (getOpCode(src)) { if (wState->state.opStack == 1 || (!wState->state.lastFin && getOpCode(src) < 2)) { - Impl::forceClose(wState, user); + Impl::forceClose(wState, user, ERR_PROTOCOL); return true; } wState->state.opCode[++wState->state.opStack] = (OpCode) getOpCode(src); } else if (wState->state.opStack == -1) { - Impl::forceClose(wState, user); + Impl::forceClose(wState, user, ERR_PROTOCOL); return true; } wState->state.lastFin = isFin(src); @@ -469,7 +471,7 @@ struct WebSocketProtocol { // invalid reserved bits / invalid opcodes / invalid control frames / set compressed frame if ((rsv1(src) && !Impl::setCompressed(wState, user)) || rsv23(src) || (getOpCode(src) > 2 && getOpCode(src) < 8) || getOpCode(src) > 10 || (getOpCode(src) > 2 && (!isFin(src) || payloadLength(src) > 125))) { - Impl::forceClose(wState, user); + Impl::forceClose(wState, user, ERR_PROTOCOL); return; }