From 704239bca8ec1c7087f37cd6da31aece205c7d31 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 11 Mar 2014 08:26:42 -0700 Subject: [PATCH] Allow zero length sends and receives. --- .../CommonWebSocket.cs | 4 +- .../WebSocketClientTests.cs | 63 +++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Net.WebSockets/CommonWebSocket.cs b/src/Microsoft.Net.WebSockets/CommonWebSocket.cs index b4315644b2..cbad809539 100644 --- a/src/Microsoft.Net.WebSockets/CommonWebSocket.cs +++ b/src/Microsoft.Net.WebSockets/CommonWebSocket.cs @@ -533,11 +533,11 @@ namespace Microsoft.Net.WebSockets { throw new ArgumentNullException("buffer"); } - if (buffer.Offset < 0 || buffer.Offset >= buffer.Array.Length) + if (buffer.Offset < 0 || buffer.Offset > buffer.Array.Length) { throw new ArgumentOutOfRangeException("buffer.Offset", buffer.Offset, string.Empty); } - if (buffer.Count <= 0 || buffer.Count > buffer.Array.Length - buffer.Offset) + if (buffer.Count < 0 || buffer.Count > buffer.Array.Length - buffer.Offset) { throw new ArgumentOutOfRangeException("buffer.Count", buffer.Count, string.Empty); } diff --git a/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs b/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs index f4c6b207fe..b0a9779c82 100644 --- a/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs +++ b/test/Microsoft.Net.WebSockets.Test/WebSocketClientTests.cs @@ -61,6 +61,38 @@ namespace Microsoft.Net.WebSockets.Test } } + [Fact] + public async Task SendEmptyData_Success() + { + using (HttpListener listener = new HttpListener()) + { + listener.Prefixes.Add(ServerAddress); + listener.Start(); + Task serverAccept = listener.GetContextAsync(); + + WebSocketClient client = new WebSocketClient(); + Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + + HttpListenerContext serverContext = await serverAccept; + Assert.True(serverContext.Request.IsWebSocketRequest); + HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); + + WebSocket clientSocket = await clientConnect; + + byte[] orriginalData = new byte[0]; + await clientSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + + byte[] serverBuffer = new byte[orriginalData.Length]; + WebSocketReceiveResult result = await serverWebSocketContext.WebSocket.ReceiveAsync(new ArraySegment(serverBuffer), CancellationToken.None); + Assert.True(result.EndOfMessage); + Assert.Equal(orriginalData.Length, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + Assert.Equal(orriginalData, serverBuffer); + + clientSocket.Dispose(); + } + } + [Fact] public async Task SendShortData_Success() { @@ -220,6 +252,37 @@ namespace Microsoft.Net.WebSockets.Test } } + [Fact] + public async Task ReceiveEmptyData_Success() + { + using (HttpListener listener = new HttpListener()) + { + listener.Prefixes.Add(ServerAddress); + listener.Start(); + Task serverAccept = listener.GetContextAsync(); + + WebSocketClient client = new WebSocketClient(); + Task clientConnect = client.ConnectAsync(new Uri(ClientAddress), CancellationToken.None); + + HttpListenerContext serverContext = await serverAccept; + Assert.True(serverContext.Request.IsWebSocketRequest); + HttpListenerWebSocketContext serverWebSocketContext = await serverContext.AcceptWebSocketAsync(null); + + WebSocket clientSocket = await clientConnect; + + byte[] orriginalData = Encoding.UTF8.GetBytes("Hello World"); + await serverWebSocketContext.WebSocket.SendAsync(new ArraySegment(orriginalData), WebSocketMessageType.Binary, true, CancellationToken.None); + + byte[] clientBuffer = new byte[0]; + WebSocketReceiveResult result = await clientSocket.ReceiveAsync(new ArraySegment(clientBuffer), CancellationToken.None); + Assert.False(result.EndOfMessage); + Assert.Equal(0, result.Count); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + clientSocket.Dispose(); + } + } + [Fact] public async Task ReceiveShortData_Success() {