Merge branch 'patch-1' of https://github.com/ReubenBond/mono into ReubenBond-patch-1
authorAlexander Köplinger <alex.koeplinger@outlook.com>
Fri, 7 Nov 2014 18:34:27 +0000 (19:34 +0100)
committerAlexander Köplinger <alex.koeplinger@outlook.com>
Fri, 7 Nov 2014 19:14:29 +0000 (20:14 +0100)
mcs/class/System/System.Net.WebSockets/ClientWebSocket.cs
mcs/class/System/Test/System.Net.WebSockets/ClientWebSocketTest.cs

index d7e999c46f36b4624cea92e5ad32c920a791308b..ff011d2f93044da4f6f28a9a7966e2800004572d 100644 (file)
@@ -318,7 +318,7 @@ namespace System.Net.WebSockets
                        var opCode = MessageTypeToWire (type);
                        var length = buffer.Count;
 
-                       headerBuffer[0] = (byte)(opCode | (endOfMessage ? 0 : 0x80));
+                       headerBuffer[0] = (byte)(opCode | (endOfMessage ? 0x80 : 0));
                        if (length < 126) {
                                headerBuffer[1] = (byte)length;
                        } else if (length <= ushort.MaxValue) {
index 2140daac9bb866aa77fb5dcebd666424dcff6f1d..a990f67e65848183a4c9ac8d2c50060406987d95 100644 (file)
@@ -217,6 +217,41 @@ namespace MonoTests.System.Net.WebSockets
                        }
                        Assert.Fail ("Should have thrown");
                }
+               
+               [Test]
+               public async Task SendAsyncEndOfMessageTest() {
+                       var cancellationToken = new CancellationTokenSource(TimeSpan.FromSeconds(30)).Token;
+                       await SendAsyncEndOfMessageTest(false, WebSocketMessageType.Text, cancellationToken);
+                       await SendAsyncEndOfMessageTest(true, WebSocketMessageType.Text, cancellationToken);
+                       await SendAsyncEndOfMessageTest(false, WebSocketMessageType.Binary, cancellationToken);
+                       await SendAsyncEndOfMessageTest(true, WebSocketMessageType.Binary, cancellationToken);
+               }
+               
+               public async Task SendAsyncEndOfMessageTest(bool expectedEndOfMessage, WebSocketMessageType webSocketMessageType, CancellationToken cancellationToken){
+                       using (var client = new ClientWebSocket()) {    
+                               // Configure the listener.
+                               var serverReceive = HandleHttpWebSocketRequestAsync<WebSocketReceiveResult>(async socket => await socket.ReceiveAsync(new ArraySegment<byte>(new byte[32]), cancellationToken), cancellationToken);
+                               
+                               // Connect to the listener and make the request.
+                               await client.ConnectAsync (new Uri ("ws://localhost:" + Port + "/"), cancellationToken);
+                               await client.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes("test")), webSocketMessageType, expectedEndOfMessage, cancellationToken);
+                               
+                               // Wait for the listener to handle the request and return its result.
+                               var result = await serverReceive;
+                               
+                               // Cleanup and check results.
+                               await client.CloseAsync(WebSocketCloseStatus.NormalClosure, "Finished", cancellationToken);
+                               Assert.AreEqual(expectedEndOfMessage, result.EndOfMessage, "EndOfMessage should be " + expectedEndOfMessage);
+                       }
+               }
+               
+               async Task<T> HandleHttpWebSocketRequestAsync<T>(Func<WebSocket, Task<T>> action, CancellationToken cancellationToken) {
+                       var ctx = await this.listener.GetContextAsync();
+                       var wsContext = await ctx.AcceptWebSocketAsync(null);
+                       var result = await action(wsContext.WebSocket);
+                       await wsContext.WebSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Finished", cancellationToken);
+                       return result;
+               }
 
                async Task HandleHttpRequestAsync (Action<HttpListenerRequest, HttpListenerResponse> handler)
                {