Skip to content

Commit 1bb6a49

Browse files
committed
@pavelsavara's version of fix.
1 parent 2760222 commit 1bb6a49

File tree

4 files changed

+45
-15
lines changed

4 files changed

+45
-15
lines changed

src/libraries/Common/tests/System/Net/Prerequisites/NetCoreServer/Handlers/EchoWebSocketHandler.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,22 @@ await socket.CloseAsync(
144144
{
145145
await Task.Delay(5000);
146146
}
147+
else if (receivedMessage == ".receiveMessageAfterClose")
148+
{
149+
byte[] buffer = new byte[1024];
150+
string message1 = $"{receivedMessage} 1 {DateTime.Now.ToString("HH:mm:ss")}";
151+
buffer = System.Text.Encoding.UTF8.GetBytes(message1);
152+
var stamp = DateTime.Now.ToString("HH:mm:ss");
153+
Console.WriteLine($"[{stamp}]: Sending message: {message1}");
154+
await socket.SendAsync(
155+
new ArraySegment<byte>(buffer, 0, message1.Length),
156+
WebSocketMessageType.Text,
157+
true,
158+
CancellationToken.None);
159+
stamp = DateTime.Now.ToString("HH:mm:ss");
160+
Console.WriteLine($"[{stamp}] Closing the socket");
161+
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, receivedMessage, CancellationToken.None);
162+
}
147163
else if (socket.State == WebSocketState.Open)
148164
{
149165
sendMessage = true;

src/libraries/System.Net.WebSockets.Client/src/System/Net/WebSockets/BrowserWebSockets/BrowserWebSocket.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,12 +385,6 @@ private void CreateCore(Uri uri, List<string>? requestedSubProtocols)
385385
#endif
386386
_closeStatus = (WebSocketCloseStatus)code;
387387
_closeStatusDescription = reason;
388-
_closeReceived = true;
389-
WebSocketState state = State;
390-
if (state == WebSocketState.Connecting || state == WebSocketState.Open || state == WebSocketState.CloseSent)
391-
{
392-
FastState = WebSocketState.Closed;
393-
}
394388
#if FEATURE_WASM_THREADS
395389
} //lock
396390
#endif

src/libraries/System.Net.WebSockets.Client/tests/CloseTest.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,35 @@ await cws.SendAsync(
367367
}
368368
}
369369

370+
[ActiveIssue("https://github.com/dotnet/runtime/issues/28957", typeof(PlatformDetection), nameof(PlatformDetection.IsNotBrowser))]
371+
[ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))]
372+
public async Task CloseOutputAsync_ServerInitiated_CanReceiveAfterClose(Uri server)
373+
{
374+
using (ClientWebSocket cws = await GetConnectedWebSocket(server, TimeOutMilliseconds, _output))
375+
{
376+
var cts = new CancellationTokenSource(TimeOutMilliseconds);
377+
378+
await cws.SendAsync(
379+
WebSocketData.GetBufferFromText(".receiveMessageAfterClose"),
380+
WebSocketMessageType.Text,
381+
true,
382+
cts.Token);
383+
384+
var recvBuffer = new ArraySegment<byte>(new byte[1024]);
385+
await Task.Delay(2000); // even if we decrease to 100, it still fails with
386+
// System.Net.WebSockets.WebSocketException : The WebSocket is in an invalid state ('Closed') for this operation. Valid states are: 'Open, CloseSent'
387+
// in the manual demo we can wait even 6 sec and the message arrives just fine
388+
var stamp = DateTime.Now.ToString("HH:mm:ss");
389+
Console.WriteLine($"[{stamp}] Attempting to receive data... cws.State={cws.State}");
390+
WebSocketReceiveResult recvResult = await cws.ReceiveAsync(recvBuffer, cts.Token);
391+
var message = Encoding.UTF8.GetString(recvBuffer.ToArray(), 0, recvResult.Count);
392+
stamp = DateTime.Now.ToString("HH:mm:ss");
393+
Console.WriteLine($"[{stamp}] Received message={message}");
394+
Assert.Contains(".shutdownAfterTwoMessages 1", message);
395+
Console.WriteLine($"cws.State={cws.State}");
396+
}
397+
}
398+
370399
[OuterLoop("Uses external servers", typeof(PlatformDetection), nameof(PlatformDetection.LocalEchoServerIsNotAvailable))]
371400
[ConditionalTheory(nameof(WebSocketsSupported)), MemberData(nameof(EchoServers))]
372401
public async Task CloseOutputAsync_CloseDescriptionIsNull_Success(Uri server)

src/mono/wasm/runtime/web-socket.ts

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,6 @@ export function ws_wasm_receive(ws: WebSocketExtension, buffer_ptr: VoidPtr, buf
175175
return null;
176176
}
177177

178-
const readyState = ws.readyState;
179-
if (readyState == WebSocket.CLOSED) {
180-
const receive_status_ptr = ws[wasm_ws_receive_status_ptr];
181-
setI32(receive_status_ptr, 0); // count
182-
setI32(<any>receive_status_ptr + 4, 2); // type:close
183-
setI32(<any>receive_status_ptr + 8, 1);// end_of_message: true
184-
return null;
185-
}
186-
187178
const { promise, promise_control } = createPromiseController<void>();
188179
const receive_promise_control = promise_control as ReceivePromiseControl;
189180
receive_promise_control.buffer_ptr = buffer_ptr;

0 commit comments

Comments
 (0)