From 1879f26a1701e7acab7c8ba32cae4b3a966fee3e Mon Sep 17 00:00:00 2001 From: Christoph Date: Thu, 27 Mar 2025 12:12:44 +0100 Subject: [PATCH] Read the incomming message to the end before handling it --- .../Jung.SimpleWebSocket.csproj | 2 +- Jung.SimpleWebSocket/SimpleWebSocketServer.cs | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Jung.SimpleWebSocket/Jung.SimpleWebSocket.csproj b/Jung.SimpleWebSocket/Jung.SimpleWebSocket.csproj index 9223703..e73f3b2 100644 --- a/Jung.SimpleWebSocket/Jung.SimpleWebSocket.csproj +++ b/Jung.SimpleWebSocket/Jung.SimpleWebSocket.csproj @@ -5,7 +5,7 @@ net8.0 enable enable - 2.0.1 + 2.0.2 diff --git a/Jung.SimpleWebSocket/SimpleWebSocketServer.cs b/Jung.SimpleWebSocket/SimpleWebSocketServer.cs index 943ca4a..fa6da43 100644 --- a/Jung.SimpleWebSocket/SimpleWebSocketServer.cs +++ b/Jung.SimpleWebSocket/SimpleWebSocketServer.cs @@ -274,21 +274,29 @@ private async Task ProcessWebSocketMessagesAsync(WebSocketServerClient client, C while (webSocket.State == WebSocketState.Open) { cancellationToken.ThrowIfCancellationRequested(); - // Read the next message - WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment(buffer), cancellationToken); + var messageBuffer = new List(); + WebSocketReceiveResult result; + + do + { + // read the incoming message in chunks + result = await webSocket.ReceiveAsync(new ArraySegment(buffer), cancellationToken); + messageBuffer.AddRange(buffer.Take(result.Count)); + } + while (!result.EndOfMessage); if (result.MessageType == WebSocketMessageType.Text) { // Handle the text message - string receivedMessage = Encoding.UTF8.GetString(buffer, 0, result.Count); + string receivedMessage = Encoding.UTF8.GetString([.. messageBuffer]); _logger?.LogDebug("Message received: {message}", receivedMessage); _ = Task.Run(() => MessageReceived?.Invoke(this, new ClientMessageReceivedArgs(receivedMessage, client.Id)), cancellationToken); } else if (result.MessageType == WebSocketMessageType.Binary) { // Handle the binary message - _logger?.LogDebug("Binary message received, length: {length} bytes", result.Count); - _ = Task.Run(() => BinaryMessageReceived?.Invoke(this, new ClientBinaryMessageReceivedArgs(buffer[..result.Count], client.Id)), cancellationToken); + _logger?.LogDebug("Binary message received, length: {length} bytes", messageBuffer.Count); + _ = Task.Run(() => BinaryMessageReceived?.Invoke(this, new ClientBinaryMessageReceivedArgs([.. messageBuffer], client.Id)), cancellationToken); } // We have to check if the is shutting down here, // because then we already sent the close message and we don't want to send another one