From bf4fe6e787cfa0b5d394c3dc38e49687a9e1f396 Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Thu, 8 Dec 2022 20:19:56 +0100 Subject: [PATCH 1/8] Fix compression --- .../System/Net/WebSockets/ClientWebSocket.cs | 3 ++ .../tests/DeflateTests.cs | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs index 7159283212d60..01cc8c0660330 100644 --- a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs +++ b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/ClientWebSocket.cs @@ -109,6 +109,9 @@ public override Task SendAsync(ArraySegment buffer, WebSocketMessageType m public override ValueTask SendAsync(ReadOnlyMemory buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) => ConnectedWebSocket.SendAsync(buffer, messageType, endOfMessage, cancellationToken); + public override ValueTask SendAsync(ReadOnlyMemory buffer, WebSocketMessageType messageType, WebSocketMessageFlags messageFlags, CancellationToken cancellationToken) => + ConnectedWebSocket.SendAsync(buffer, messageType, messageFlags, cancellationToken); + public override Task ReceiveAsync(ArraySegment buffer, CancellationToken cancellationToken) => ConnectedWebSocket.ReceiveAsync(buffer, cancellationToken); diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index e0a0e1e59fd84..6d011b201c8db 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -72,6 +72,53 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => }), new LoopbackServer.Options { WebSocketEndpoint = true }); } + [ConditionalFact(nameof(WebSocketsSupported))] + public async Task ThrowWhenContinuationWithDifferentCompressionFlags() + { + await LoopbackServer.CreateClientAndServerAsync(async uri => + { + using (var cws = new ClientWebSocket()) + using (var cts = new CancellationTokenSource(TimeOutMilliseconds)) + { + cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + await ConnectAsync(cws, uri, cts.Token); + + await cws.SendAsync(Memory.Empty, WebSocketMessageType.Text, WebSocketMessageFlags.DisableCompression, default); + Assert.Throws("messageFlags", () => + cws.SendAsync(Memory.Empty, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, default)); + } + }, server => server.AcceptConnectionAsync(async connection => + { + Dictionary headers = await LoopbackHelper.WebSocketHandshakeAsync(connection); + }), new LoopbackServer.Options { WebSocketEndpoint = true }); + } + + [ConditionalFact(nameof(WebSocketsSupported))] + public async Task SendHelloWithDisableCompression() + { + byte[] bytes = "Hello"u8.ToArray(); + await LoopbackServer.CreateClientAndServerAsync(async uri => + { + using (var cws = new ClientWebSocket()) + using (var cts = new CancellationTokenSource(TimeOutMilliseconds)) + { + cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + await ConnectAsync(cws, uri, cts.Token); + + WebSocketMessageFlags flags = WebSocketMessageFlags.DisableCompression | WebSocketMessageFlags.EndOfMessage; + await cws.SendAsync(bytes, WebSocketMessageType.Text, flags, cts.Token); + } + }, server => server.AcceptConnectionAsync(async connection => + { + var buffer = new byte[bytes.Length]; + Dictionary headers = await LoopbackHelper.WebSocketHandshakeAsync(connection); + using WebSocket websocket = WebSocket.CreateFromStream(connection.Stream, true, null, TimeSpan.FromSeconds(30)); + Assert.True(websocket.State == WebSocketState.Open || websocket.State == WebSocketState.CloseSent); + await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + Assert.Equal(bytes, buffer); + }), new LoopbackServer.Options { WebSocketEndpoint = true }); + } + private static string CreateDeflateOptionsHeader(WebSocketDeflateOptions options) { var builder = new StringBuilder(); From ab5069a45350f2f1b34d451db3507ca9cb2ea515 Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Fri, 9 Dec 2022 13:21:09 +0100 Subject: [PATCH 2/8] Apply suggestions from code review Co-authored-by: Miha Zupan --- .../tests/DeflateTests.cs | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index 6d011b201c8db..f6953fd1404dc 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -73,23 +73,22 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => } [ConditionalFact(nameof(WebSocketsSupported))] - public async Task ThrowWhenContinuationWithDifferentCompressionFlags() + public async Task ThrowsWhenContinuationHasDifferentCompressionFlags() { await LoopbackServer.CreateClientAndServerAsync(async uri => { - using (var cws = new ClientWebSocket()) - using (var cts = new CancellationTokenSource(TimeOutMilliseconds)) - { - cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); - await ConnectAsync(cws, uri, cts.Token); + using var cws = new ClientWebSocket(); + using var cts = new CancellationTokenSource(TimeOutMilliseconds); + + cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + await ConnectAsync(cws, uri, cts.Token); - await cws.SendAsync(Memory.Empty, WebSocketMessageType.Text, WebSocketMessageFlags.DisableCompression, default); - Assert.Throws("messageFlags", () => - cws.SendAsync(Memory.Empty, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, default)); - } + await cws.SendAsync(Memory.Empty, WebSocketMessageType.Text, WebSocketMessageFlags.DisableCompression, default); + Assert.Throws("messageFlags", () => + cws.SendAsync(Memory.Empty, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, default)); }, server => server.AcceptConnectionAsync(async connection => { - Dictionary headers = await LoopbackHelper.WebSocketHandshakeAsync(connection); + await LoopbackHelper.WebSocketHandshakeAsync(connection); }), new LoopbackServer.Options { WebSocketEndpoint = true }); } @@ -99,19 +98,18 @@ public async Task SendHelloWithDisableCompression() byte[] bytes = "Hello"u8.ToArray(); await LoopbackServer.CreateClientAndServerAsync(async uri => { - using (var cws = new ClientWebSocket()) - using (var cts = new CancellationTokenSource(TimeOutMilliseconds)) - { - cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); - await ConnectAsync(cws, uri, cts.Token); + using var cws = new ClientWebSocket(); + using var cts = new CancellationTokenSource(TimeOutMilliseconds); + + cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + await ConnectAsync(cws, uri, cts.Token); - WebSocketMessageFlags flags = WebSocketMessageFlags.DisableCompression | WebSocketMessageFlags.EndOfMessage; - await cws.SendAsync(bytes, WebSocketMessageType.Text, flags, cts.Token); - } + WebSocketMessageFlags flags = WebSocketMessageFlags.DisableCompression | WebSocketMessageFlags.EndOfMessage; + await cws.SendAsync(bytes, WebSocketMessageType.Text, flags, cts.Token); }, server => server.AcceptConnectionAsync(async connection => { var buffer = new byte[bytes.Length]; - Dictionary headers = await LoopbackHelper.WebSocketHandshakeAsync(connection); + await LoopbackHelper.WebSocketHandshakeAsync(connection); using WebSocket websocket = WebSocket.CreateFromStream(connection.Stream, true, null, TimeSpan.FromSeconds(30)); Assert.True(websocket.State == WebSocketState.Open || websocket.State == WebSocketState.CloseSent); await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); From b974ec01ca8fa2afb1721ef5a6d392356adcc35b Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Fri, 9 Dec 2022 13:24:30 +0100 Subject: [PATCH 3/8] Adding SendAsync to ref --- .../ref/System.Net.WebSockets.Client.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs b/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs index 96cecd9e30f47..b143d3bb09386 100644 --- a/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs +++ b/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs @@ -23,6 +23,7 @@ public override void Dispose() { } public override System.Threading.Tasks.ValueTask ReceiveAsync(System.Memory buffer, System.Threading.CancellationToken cancellationToken) { throw null; } public override System.Threading.Tasks.Task SendAsync(System.ArraySegment buffer, System.Net.WebSockets.WebSocketMessageType messageType, bool endOfMessage, System.Threading.CancellationToken cancellationToken) { throw null; } public override System.Threading.Tasks.ValueTask SendAsync(System.ReadOnlyMemory buffer, System.Net.WebSockets.WebSocketMessageType messageType, bool endOfMessage, System.Threading.CancellationToken cancellationToken) { throw null; } + public override System.Threading.Tasks.ValueTask SendAsync(System.ReadOnlyMemory buffer, System.Net.WebSockets.WebSocketMessageType messageType, System.Net.WebSockets.WebSocketMessageFlags messageFlags, System.Threading.CancellationToken cancellationToken) { throw null; } } public sealed partial class ClientWebSocketOptions { From 8c0b9ed3ecf758865cf3ce9332d6889fef0deb6f Mon Sep 17 00:00:00 2001 From: Katya Sokolova Date: Fri, 9 Dec 2022 15:02:07 +0100 Subject: [PATCH 4/8] fix ws deflate tests --- .../tests/DeflateTests.cs | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index f6953fd1404dc..2d326a4b7eaec 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -75,20 +75,29 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => [ConditionalFact(nameof(WebSocketsSupported))] public async Task ThrowsWhenContinuationHasDifferentCompressionFlags() { + var deflateOpt = new WebSocketDeflateOptions + { + ClientMaxWindowBits = 14, + ClientContextTakeover = true, + ServerMaxWindowBits = 14, + ServerContextTakeover = true + }; await LoopbackServer.CreateClientAndServerAsync(async uri => { using var cws = new ClientWebSocket(); using var cts = new CancellationTokenSource(TimeOutMilliseconds); - cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + cws.Options.DangerousDeflateOptions = deflateOpt; await ConnectAsync(cws, uri, cts.Token); + await cws.SendAsync(Memory.Empty, WebSocketMessageType.Text, WebSocketMessageFlags.DisableCompression, default); Assert.Throws("messageFlags", () => cws.SendAsync(Memory.Empty, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, default)); }, server => server.AcceptConnectionAsync(async connection => { - await LoopbackHelper.WebSocketHandshakeAsync(connection); + var extensionsReply = CreateDeflateOptionsHeader(deflateOpt); + await LoopbackHelper.WebSocketHandshakeAsync(connection, extensionsReply); }), new LoopbackServer.Options { WebSocketEndpoint = true }); } @@ -96,22 +105,43 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => public async Task SendHelloWithDisableCompression() { byte[] bytes = "Hello"u8.ToArray(); + byte[] compressed = new byte[] { 0xc1, 0x07, 0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x07, 0x00 }; + var deflateOpt = new WebSocketDeflateOptions + { + ClientMaxWindowBits = 14, + ClientContextTakeover = true, + ServerMaxWindowBits = 14, + ServerContextTakeover = true + }; + await LoopbackServer.CreateClientAndServerAsync(async uri => { using var cws = new ClientWebSocket(); using var cts = new CancellationTokenSource(TimeOutMilliseconds); - cws.Options.DangerousDeflateOptions = new WebSocketDeflateOptions(); + cws.Options.DangerousDeflateOptions = deflateOpt; await ConnectAsync(cws, uri, cts.Token); + await cws.SendAsync(bytes, WebSocketMessageType.Text, true, cts.Token); + WebSocketMessageFlags flags = WebSocketMessageFlags.DisableCompression | WebSocketMessageFlags.EndOfMessage; await cws.SendAsync(bytes, WebSocketMessageType.Text, flags, cts.Token); }, server => server.AcceptConnectionAsync(async connection => { var buffer = new byte[bytes.Length]; - await LoopbackHelper.WebSocketHandshakeAsync(connection); - using WebSocket websocket = WebSocket.CreateFromStream(connection.Stream, true, null, TimeSpan.FromSeconds(30)); + var extensionsReply = CreateDeflateOptionsHeader(deflateOpt); + await LoopbackHelper.WebSocketHandshakeAsync(connection, extensionsReply); + using WebSocket websocket = WebSocket.CreateFromStream(connection.Stream, new WebSocketCreationOptions + { + IsServer = true, + DangerousDeflateOptions = deflateOpt + }); + Assert.True(websocket.State == WebSocketState.Open || websocket.State == WebSocketState.CloseSent); + + await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); + Assert.Equal(bytes, buffer); + await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); Assert.Equal(bytes, buffer); }), new LoopbackServer.Options { WebSocketEndpoint = true }); From 4c1d75db4f00ad6fa8d60c08133e161a54ccbc4c Mon Sep 17 00:00:00 2001 From: Natalia Kondratyeva Date: Mon, 12 Dec 2022 13:26:10 +0000 Subject: [PATCH 5/8] Check bytes on server side --- .../tests/DeflateTests.cs | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index 2d326a4b7eaec..625b78160316a 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -105,7 +105,13 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => public async Task SendHelloWithDisableCompression() { byte[] bytes = "Hello"u8.ToArray(); - byte[] compressed = new byte[] { 0xc1, 0x07, 0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x07, 0x00 }; + + int prefixLength = 2; + byte[] rawPrefix = new byte[] { 0x81, 0x85 }; // fin=1, rsv=0, opcode=text; mask=1, len=5 + int rawRemainingBytes = 9; // mask bytes (4) + payload bytes (5) + byte[] compressedPrefix = new byte[] { 0xc1, 0x87 }; // fin=1, rsv=compressed, opcode=text; mask=1, len=7 + int compressedRemainingBytes = 11; // mask bytes (4) + payload bytes (7) + var deflateOpt = new WebSocketDeflateOptions { ClientMaxWindowBits = 14, @@ -128,22 +134,26 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => await cws.SendAsync(bytes, WebSocketMessageType.Text, flags, cts.Token); }, server => server.AcceptConnectionAsync(async connection => { - var buffer = new byte[bytes.Length]; + var buffer = new byte[compressedRemainingBytes]; var extensionsReply = CreateDeflateOptionsHeader(deflateOpt); await LoopbackHelper.WebSocketHandshakeAsync(connection, extensionsReply); - using WebSocket websocket = WebSocket.CreateFromStream(connection.Stream, new WebSocketCreationOptions - { - IsServer = true, - DangerousDeflateOptions = deflateOpt - }); - Assert.True(websocket.State == WebSocketState.Open || websocket.State == WebSocketState.CloseSent); + // first message is compressed + await ReadExactAsync(buffer, prefixLength); + Assert.Equal(compressedPrefix, buffer[..prefixLength]); + // read rest of the frame + await ReadExactAsync(buffer, compressedRemainingBytes); - await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); - Assert.Equal(bytes, buffer); + // second message is not compressed + await ReadExactAsync(buffer, prefixLength); + Assert.Equal(rawPrefix, buffer[..prefixLength]); + // read rest of the frame + await ReadExactAsync(buffer, rawRemainingBytes); - await websocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); - Assert.Equal(bytes, buffer); + async Task ReadExactAsync(byte[] buf, int n) + { + await connection.Stream.ReadAtLeastAsync(buf.AsMemory(0, n), n); + } }), new LoopbackServer.Options { WebSocketEndpoint = true }); } From 04e88c11cbc8019abd1607431e6f6ddfddbf9572 Mon Sep 17 00:00:00 2001 From: Natalia Kondratyeva Date: Tue, 13 Dec 2022 11:31:34 +0100 Subject: [PATCH 6/8] Fix u8 Co-authored-by: Miha Zupan --- .../System.Net.WebSockets.Client/tests/DeflateTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index 625b78160316a..3641a4379228e 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -104,7 +104,7 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => [ConditionalFact(nameof(WebSocketsSupported))] public async Task SendHelloWithDisableCompression() { - byte[] bytes = "Hello"u8.ToArray(); + byte[] bytes = Encoding.ASCII.GetBytes("Hello"); int prefixLength = 2; byte[] rawPrefix = new byte[] { 0x81, 0x85 }; // fin=1, rsv=0, opcode=text; mask=1, len=5 From 1f67dc73d95ace4adbef983144a0a02c75423857 Mon Sep 17 00:00:00 2001 From: Natalia Kondratyeva Date: Tue, 13 Dec 2022 13:26:11 +0000 Subject: [PATCH 7/8] Fix build on net6.0 --- .../tests/DeflateTests.cs | 17 +++++++++++++---- .../tests/wasm/BrowserTimerThrottlingTest.cs | 4 ++-- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index 3641a4379228e..5a969c014965d 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -88,8 +88,7 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => using var cts = new CancellationTokenSource(TimeOutMilliseconds); cws.Options.DangerousDeflateOptions = deflateOpt; - await ConnectAsync(cws, uri, cts.Token); - + await cws.ConnectAsync(uri, cts.Token); await cws.SendAsync(Memory.Empty, WebSocketMessageType.Text, WebSocketMessageFlags.DisableCompression, default); Assert.Throws("messageFlags", () => @@ -126,7 +125,7 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => using var cts = new CancellationTokenSource(TimeOutMilliseconds); cws.Options.DangerousDeflateOptions = deflateOpt; - await ConnectAsync(cws, uri, cts.Token); + await cws.ConnectAsync(uri, cts.Token); await cws.SendAsync(bytes, WebSocketMessageType.Text, true, cts.Token); @@ -152,7 +151,17 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => async Task ReadExactAsync(byte[] buf, int n) { - await connection.Stream.ReadAtLeastAsync(buf.AsMemory(0, n), n); + var mem = buf.AsMemory(0, n); + int totalRead = 0; + while (totalRead < n) + { + int read = await connection.Stream.ReadAsync(mem.Slice(totalRead)).ConfigureAwait(false); + if (read == 0) + { + throw new Exception("Unexpected end of stream"); + } + totalRead += read; + } } }), new LoopbackServer.Options { WebSocketEndpoint = true }); } diff --git a/src/libraries/System.Net.WebSockets.Client/tests/wasm/BrowserTimerThrottlingTest.cs b/src/libraries/System.Net.WebSockets.Client/tests/wasm/BrowserTimerThrottlingTest.cs index df6e5f1770590..bd44afd52fab5 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/wasm/BrowserTimerThrottlingTest.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/wasm/BrowserTimerThrottlingTest.cs @@ -158,12 +158,12 @@ private async static Task SendAndReceive(ClientWebSocket cws, string message) catch (OperationCanceledException) { } +#if DEBUG catch (Exception ex) { -#if DEBUG Console.WriteLine("SendAndReceive fail:" + ex); -#endif } +#endif } } From 33f470a66f46b27c5e25f57619785097dc12b319 Mon Sep 17 00:00:00 2001 From: Natalia Kondratyeva Date: Wed, 4 Jan 2023 18:39:46 +0000 Subject: [PATCH 8/8] Remove ref assembly change, pr feedback --- .../ref/System.Net.WebSockets.Client.cs | 1 - .../System.Net.WebSockets.Client/tests/DeflateTests.cs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs b/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs index b143d3bb09386..96cecd9e30f47 100644 --- a/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs +++ b/src/libraries/System.Net.WebSockets.Client/ref/System.Net.WebSockets.Client.cs @@ -23,7 +23,6 @@ public override void Dispose() { } public override System.Threading.Tasks.ValueTask ReceiveAsync(System.Memory buffer, System.Threading.CancellationToken cancellationToken) { throw null; } public override System.Threading.Tasks.Task SendAsync(System.ArraySegment buffer, System.Net.WebSockets.WebSocketMessageType messageType, bool endOfMessage, System.Threading.CancellationToken cancellationToken) { throw null; } public override System.Threading.Tasks.ValueTask SendAsync(System.ReadOnlyMemory buffer, System.Net.WebSockets.WebSocketMessageType messageType, bool endOfMessage, System.Threading.CancellationToken cancellationToken) { throw null; } - public override System.Threading.Tasks.ValueTask SendAsync(System.ReadOnlyMemory buffer, System.Net.WebSockets.WebSocketMessageType messageType, System.Net.WebSockets.WebSocketMessageFlags messageFlags, System.Threading.CancellationToken cancellationToken) { throw null; } } public sealed partial class ClientWebSocketOptions { diff --git a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs index 5a969c014965d..f65f93a566496 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/DeflateTests.cs @@ -95,7 +95,7 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => cws.SendAsync(Memory.Empty, WebSocketMessageType.Binary, WebSocketMessageFlags.EndOfMessage, default)); }, server => server.AcceptConnectionAsync(async connection => { - var extensionsReply = CreateDeflateOptionsHeader(deflateOpt); + string extensionsReply = CreateDeflateOptionsHeader(deflateOpt); await LoopbackHelper.WebSocketHandshakeAsync(connection, extensionsReply); }), new LoopbackServer.Options { WebSocketEndpoint = true }); } @@ -134,7 +134,7 @@ await LoopbackServer.CreateClientAndServerAsync(async uri => }, server => server.AcceptConnectionAsync(async connection => { var buffer = new byte[compressedRemainingBytes]; - var extensionsReply = CreateDeflateOptionsHeader(deflateOpt); + string extensionsReply = CreateDeflateOptionsHeader(deflateOpt); await LoopbackHelper.WebSocketHandshakeAsync(connection, extensionsReply); // first message is compressed