@@ -33,6 +33,8 @@ const std::string_view ERR_WEBSOCKET_TIMEOUT("WebSocket timed out from inactivit
3333const std::string_view ERR_INVALID_TEXT (" Received invalid UTF-8" );
3434const std::string_view ERR_TOO_BIG_MESSAGE_INFLATION (" Received too big message, or other inflation error" );
3535const 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
3739enum 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