From 2d567ea82fa9a374b13d9e3af7f32dbaa57bebc3 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Fri, 2 Jul 2021 14:20:22 +0200 Subject: [PATCH 1/3] _innerWebSocket is already disposed by after abort. --- .../BrowserWebSockets/BrowserWebSocket.cs | 19 +++++++++++++++++-- .../tests/AbortTest.cs | 10 +++++----- .../tests/ConnectTest.cs | 1 - 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs index 0eae170576a7d6..3ba250d703483b 100644 --- a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs +++ b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs @@ -574,7 +574,15 @@ private Task CloseAsyncCore(WebSocketCloseStatus closeStatus, string? statusDesc _innerWebSocketCloseStatus = closeStatus; _innerWebSocketCloseStatusDescription = statusDescription; _innerWebSocket!.Invoke("close", (int)closeStatus, statusDescription); - _closeStatus = (int)_innerWebSocket.GetObjectProperty("readyState"); + if (_innerWebSocket != null && !_innerWebSocket.IsDisposed && _state != (int)InternalState.Aborted) + { + _closeStatus = (int)_innerWebSocket.GetObjectProperty("readyState"); + } + else + { + _closeStatus =3; // (CLOSED) + } + return _tcsClose.Task; } catch (Exception exc) @@ -612,7 +620,14 @@ private Task CloseOutputAsyncCore(WebSocketCloseStatus closeStatus, string? stat _innerWebSocketCloseStatus = closeStatus; _innerWebSocketCloseStatusDescription = statusDescription; _innerWebSocket!.Invoke("close", (int)closeStatus, statusDescription); - _closeStatus = (int)_innerWebSocket.GetObjectProperty("readyState"); + if (_innerWebSocket != null && !_innerWebSocket.IsDisposed && _state != (int)InternalState.Aborted) + { + _closeStatus = (int)_innerWebSocket.GetObjectProperty("readyState"); + } + else + { + _closeStatus =3; // (CLOSED) + } OnCloseCallback(null, cancellationToken); return Task.CompletedTask; } diff --git a/src/libraries/System.Net.WebSockets.Client/tests/AbortTest.cs b/src/libraries/System.Net.WebSockets.Client/tests/AbortTest.cs index 6e9a60f0647935..209a6f10ff23b4 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/AbortTest.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/AbortTest.cs @@ -15,7 +15,7 @@ public class AbortTest : ClientWebSocketTestBase { public AbortTest(ITestOutputHelper output) : base(output) { } - [OuterLoop] + [OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))] [ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))] public async Task Abort_ConnectAndAbort_ThrowsWebSocketExceptionWithmessage(Uri server) { @@ -40,7 +40,7 @@ public async Task Abort_ConnectAndAbort_ThrowsWebSocketExceptionWithmessage(Uri } } - [OuterLoop] + [OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))] [ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))] public async Task Abort_SendAndAbort_Success(Uri server) { @@ -60,7 +60,7 @@ await TestCancellation(async (cws) => }, server); } - [OuterLoop] + [OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))] [ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))] public async Task Abort_ReceiveAndAbort_Success(Uri server) { @@ -84,7 +84,7 @@ await cws.SendAsync( }, server); } - [OuterLoop] + [OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))] [ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))] public async Task Abort_CloseAndAbort_Success(Uri server) { @@ -108,7 +108,7 @@ await cws.SendAsync( }, server); } - [OuterLoop] + [OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))] [ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))] public async Task ClientWebSocket_Abort_CloseOutputAsync(Uri server) { diff --git a/src/libraries/System.Net.WebSockets.Client/tests/ConnectTest.cs b/src/libraries/System.Net.WebSockets.Client/tests/ConnectTest.cs index 0fb1314a6068ee..296bffbc620aed 100644 --- a/src/libraries/System.Net.WebSockets.Client/tests/ConnectTest.cs +++ b/src/libraries/System.Net.WebSockets.Client/tests/ConnectTest.cs @@ -282,7 +282,6 @@ public async Task ConnectAsync_CancellationRequestedInflightConnect_ThrowsOperat [ConditionalFact(nameof(WebSocketsSupported))] [ActiveIssue("https://github.com/dotnet/runtime/issues/34690", TestPlatforms.Windows, TargetFrameworkMonikers.Netcoreapp, TestRuntimes.Mono)] - [ActiveIssue("https://github.com/dotnet/runtime/issues/54152", TestPlatforms.Browser)] public async Task ConnectAsync_CancellationRequestedAfterConnect_ThrowsOperationCanceledException() { var releaseServer = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); From 39f38ba981483b4aeb54793e6c8e4bafa0bb79ea Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Fri, 2 Jul 2021 17:51:16 +0200 Subject: [PATCH 2/3] Update src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: campersau --- .../System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs index 3ba250d703483b..3cf8acb804b90a 100644 --- a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs +++ b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs @@ -626,7 +626,7 @@ private Task CloseOutputAsyncCore(WebSocketCloseStatus closeStatus, string? stat } else { - _closeStatus =3; // (CLOSED) + _closeStatus = 3; // (CLOSED) } OnCloseCallback(null, cancellationToken); return Task.CompletedTask; From 92e27051e9d9d3cb5ecf22a12091d5f34e1ed8ad Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Fri, 2 Jul 2021 17:51:21 +0200 Subject: [PATCH 3/3] Update src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs Co-authored-by: campersau --- .../System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs index 3cf8acb804b90a..b052020b11e0f5 100644 --- a/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs +++ b/src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs @@ -580,7 +580,7 @@ private Task CloseAsyncCore(WebSocketCloseStatus closeStatus, string? statusDesc } else { - _closeStatus =3; // (CLOSED) + _closeStatus = 3; // (CLOSED) } return _tcsClose.Task;