Browse Source

Merge pull request #100631 from Faless/fix/wslay_frame_end_not_fin

[WS] Fix wslay multi-frame message parsing
Rémi Verschelde 8 months ago
parent
commit
7dd14207dc
2 changed files with 9 additions and 14 deletions
  1. 9 13
      modules/websocket/wsl_peer.cpp
  2. 0 1
      modules/websocket/wsl_peer.h

+ 9 - 13
modules/websocket/wsl_peer.cpp

@@ -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) {
 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;
 	WSLPeer *peer = (WSLPeer *)user_data;
 	Ref<StreamPeer> conn = peer->connection;
 	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) {
 	if (op == WSLAY_PONG) {
 		peer->heartbeat_waiting = false;
 		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 = {
 wslay_event_callbacks WSLPeer::_wsl_callbacks = {
@@ -679,7 +675,7 @@ wslay_event_callbacks WSLPeer::_wsl_callbacks = {
 	_wsl_genmask_callback,
 	_wsl_genmask_callback,
 	_wsl_recv_start_callback,
 	_wsl_recv_start_callback,
 	_wsl_frame_recv_chunk_callback,
 	_wsl_frame_recv_chunk_callback,
-	_wsl_frame_recv_end_callback,
+	nullptr,
 	_wsl_msg_recv_callback
 	_wsl_msg_recv_callback
 };
 };
 
 

+ 0 - 1
modules/websocket/wsl_peer.h

@@ -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 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_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_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 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);
 	static int _wsl_genmask_callback(wslay_event_context_ptr ctx, uint8_t *buf, size_t len, void *user_data);