Skip to content

Commit 57f2662

Browse files
committed
Emit more telling 1006 close events
1 parent 8d8fc0a commit 57f2662

File tree

2 files changed

+7
-5
lines changed

2 files changed

+7
-5
lines changed

src/WebSocketContext.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,11 +371,11 @@ struct WebSocketContext {
371371
return s;
372372
});
373373

374-
/* Handle FIN, HTTP does not support half-closed sockets, so simply close */
374+
/* Handle FIN, WebSocket does not support half-closed sockets, so simply close */
375375
us_socket_context_on_end(SSL, getSocketContext(), [](auto *s) {
376376

377377
/* If we get a fin, we just close I guess */
378-
us_socket_close(SSL, (us_socket_t *) s, 0, nullptr);
378+
us_socket_close(SSL, (us_socket_t *) s, (int) ERR_TCP_FIN.length(), (void *) ERR_TCP_FIN.data());
379379

380380
return s;
381381
});

src/WebSocketProtocol.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ const std::string_view ERR_WEBSOCKET_TIMEOUT("WebSocket timed out from inactivit
3333
const std::string_view ERR_INVALID_TEXT("Received invalid UTF-8");
3434
const std::string_view ERR_TOO_BIG_MESSAGE_INFLATION("Received too big message, or other inflation error");
3535
const std::string_view ERR_INVALID_CLOSE_PAYLOAD("Received invalid close payload");
36+
const std::string_view ERR_PROTOCOL("Received invalid WebSocket frame");
37+
const std::string_view ERR_TCP_FIN("Received TCP FIN before WebSocket close frame");
3638

3739
enum OpCode : unsigned char {
3840
CONTINUATION = 0,
@@ -341,12 +343,12 @@ struct WebSocketProtocol {
341343
static inline bool consumeMessage(T payLength, char *&src, unsigned int &length, WebSocketState<isServer> *wState, void *user) {
342344
if (getOpCode(src)) {
343345
if (wState->state.opStack == 1 || (!wState->state.lastFin && getOpCode(src) < 2)) {
344-
Impl::forceClose(wState, user);
346+
Impl::forceClose(wState, user, ERR_PROTOCOL);
345347
return true;
346348
}
347349
wState->state.opCode[++wState->state.opStack] = (OpCode) getOpCode(src);
348350
} else if (wState->state.opStack == -1) {
349-
Impl::forceClose(wState, user);
351+
Impl::forceClose(wState, user, ERR_PROTOCOL);
350352
return true;
351353
}
352354
wState->state.lastFin = isFin(src);
@@ -469,7 +471,7 @@ struct WebSocketProtocol {
469471
// invalid reserved bits / invalid opcodes / invalid control frames / set compressed frame
470472
if ((rsv1(src) && !Impl::setCompressed(wState, user)) || rsv23(src) || (getOpCode(src) > 2 && getOpCode(src) < 8) ||
471473
getOpCode(src) > 10 || (getOpCode(src) > 2 && (!isFin(src) || payloadLength(src) > 125))) {
472-
Impl::forceClose(wState, user);
474+
Impl::forceClose(wState, user, ERR_PROTOCOL);
473475
return;
474476
}
475477

0 commit comments

Comments
 (0)