1
0
Fork 0

Merge pull request #100631 from Faless/fix/wslay_frame_end_not_fin

[WS] Fix wslay multi-frame message parsing
This commit is contained in:
Rémi Verschelde 2025-01-03 00:48:47 +01:00
commit 7dd14207dc
No known key found for this signature in database
GPG Key ID: C3336907360768E1
2 changed files with 9 additions and 14 deletions

View File

@ -611,17 +611,6 @@ void WSLPeer::_wsl_frame_recv_chunk_callback(wslay_event_context_ptr ctx, const
}
}
void WSLPeer::_wsl_frame_recv_end_callback(wslay_event_context_ptr ctx, void *user_data) {
WSLPeer *peer = (WSLPeer *)user_data;
PendingMessage &pm = peer->pending_message;
if (pm.opcode != 0) {
// Only write the packet (since it's now completed).
uint8_t is_string = pm.opcode == WSLAY_TEXT_FRAME ? 1 : 0;
peer->in_buffer.write_packet(nullptr, pm.payload_size, &is_string);
pm.clear();
}
}
ssize_t WSLPeer::_wsl_send_callback(wslay_event_context_ptr ctx, const uint8_t *data, size_t len, int flags, void *user_data) {
WSLPeer *peer = (WSLPeer *)user_data;
Ref<StreamPeer> conn = peer->connection;
@ -669,8 +658,15 @@ void WSLPeer::_wsl_msg_recv_callback(wslay_event_context_ptr ctx, const struct w
if (op == WSLAY_PONG) {
peer->heartbeat_waiting = false;
} else if (op == WSLAY_TEXT_FRAME || op == WSLAY_BINARY_FRAME) {
PendingMessage &pm = peer->pending_message;
ERR_FAIL_COND(pm.opcode != op);
// Only write the packet (since it's now completed).
uint8_t is_string = pm.opcode == WSLAY_TEXT_FRAME ? 1 : 0;
peer->in_buffer.write_packet(nullptr, pm.payload_size, &is_string);
pm.clear();
}
// Ping, or message (already parsed in chunks).
// Ping.
}
wslay_event_callbacks WSLPeer::_wsl_callbacks = {
@ -679,7 +675,7 @@ wslay_event_callbacks WSLPeer::_wsl_callbacks = {
_wsl_genmask_callback,
_wsl_recv_start_callback,
_wsl_frame_recv_chunk_callback,
_wsl_frame_recv_end_callback,
nullptr,
_wsl_msg_recv_callback
};

View File

@ -53,7 +53,6 @@ private:
static ssize_t _wsl_recv_callback(wslay_event_context_ptr ctx, uint8_t *data, size_t len, int flags, void *user_data);
static void _wsl_recv_start_callback(wslay_event_context_ptr ctx, const struct wslay_event_on_frame_recv_start_arg *arg, void *user_data);
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);
static void _wsl_frame_recv_end_callback(wslay_event_context_ptr ctx, void *user_data);
static ssize_t _wsl_send_callback(wslay_event_context_ptr ctx, const uint8_t *data, size_t len, int flags, void *user_data);
static int _wsl_genmask_callback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, void *user_data);