Skip to content

Commit 7dd1420

Browse files
committed
Merge pull request #100631 from Faless/fix/wslay_frame_end_not_fin
[WS] Fix wslay multi-frame message parsing
2 parents 261f0b9 + d798068 commit 7dd1420

File tree

2 files changed

+9
-14
lines changed

2 files changed

+9
-14
lines changed

modules/websocket/wsl_peer.cpp

+9-13
Original file line numberDiff line numberDiff line change
@@ -611,17 +611,6 @@ void WSLPeer::_wsl_frame_recv_chunk_callback(wslay_event_context_ptr ctx, const
611611
}
612612
}
613613

614-
void WSLPeer::_wsl_frame_recv_end_callback(wslay_event_context_ptr ctx, void *user_data) {
615-
WSLPeer *peer = (WSLPeer *)user_data;
616-
PendingMessage &pm = peer->pending_message;
617-
if (pm.opcode != 0) {
618-
// Only write the packet (since it's now completed).
619-
uint8_t is_string = pm.opcode == WSLAY_TEXT_FRAME ? 1 : 0;
620-
peer->in_buffer.write_packet(nullptr, pm.payload_size, &is_string);
621-
pm.clear();
622-
}
623-
}
624-
625614
ssize_t WSLPeer::_wsl_send_callback(wslay_event_context_ptr ctx, const uint8_t *data, size_t len, int flags, void *user_data) {
626615
WSLPeer *peer = (WSLPeer *)user_data;
627616
Ref<StreamPeer> conn = peer->connection;
@@ -669,8 +658,15 @@ void WSLPeer::_wsl_msg_recv_callback(wslay_event_context_ptr ctx, const struct w
669658

670659
if (op == WSLAY_PONG) {
671660
peer->heartbeat_waiting = false;
661+
} else if (op == WSLAY_TEXT_FRAME || op == WSLAY_BINARY_FRAME) {
662+
PendingMessage &pm = peer->pending_message;
663+
ERR_FAIL_COND(pm.opcode != op);
664+
// Only write the packet (since it's now completed).
665+
uint8_t is_string = pm.opcode == WSLAY_TEXT_FRAME ? 1 : 0;
666+
peer->in_buffer.write_packet(nullptr, pm.payload_size, &is_string);
667+
pm.clear();
672668
}
673-
// Ping, or message (already parsed in chunks).
669+
// Ping.
674670
}
675671

676672
wslay_event_callbacks WSLPeer::_wsl_callbacks = {
@@ -679,7 +675,7 @@ wslay_event_callbacks WSLPeer::_wsl_callbacks = {
679675
_wsl_genmask_callback,
680676
_wsl_recv_start_callback,
681677
_wsl_frame_recv_chunk_callback,
682-
_wsl_frame_recv_end_callback,
678+
nullptr,
683679
_wsl_msg_recv_callback
684680
};
685681

modules/websocket/wsl_peer.h

-1
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ class WSLPeer : public WebSocketPeer {
5353
static ssize_t _wsl_recv_callback(wslay_event_context_ptr ctx, uint8_t *data, size_t len, int flags, void *user_data);
5454
static void _wsl_recv_start_callback(wslay_event_context_ptr ctx, const struct wslay_event_on_frame_recv_start_arg *arg, void *user_data);
5555
static void _wsl_frame_recv_chunk_callback(wslay_event_context_ptr ctx, const struct wslay_event_on_frame_recv_chunk_arg *arg, void *user_data);
56-
static void _wsl_frame_recv_end_callback(wslay_event_context_ptr ctx, void *user_data);
5756

5857
static ssize_t _wsl_send_callback(wslay_event_context_ptr ctx, const uint8_t *data, size_t len, int flags, void *user_data);
5958
static int _wsl_genmask_callback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, void *user_data);

0 commit comments

Comments
 (0)