Skip to content

Commit 524ea30

Browse files
committed
rebase
1 parent 1f829e0 commit 524ea30

File tree

10 files changed

+539
-375
lines changed

10 files changed

+539
-375
lines changed

src/libraries/Common/src/System/Net/WebSockets/WebSocketValidate.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ internal static partial class WebSocketValidate
2323
internal const int MaxDeflateWindowBits = 15;
2424

2525
internal const int MaxControlFramePayloadLength = 123;
26+
#if TARGET_BROWSER
27+
private const int ValidCloseStatusCodesFrom = 3000;
28+
private const int ValidCloseStatusCodesTo = 4999;
29+
#else
2630
private const int CloseStatusCodeAbort = 1006;
2731
private const int CloseStatusCodeFailedTLSHandshake = 1015;
2832
private const int InvalidCloseStatusCodesFrom = 0;
2933
private const int InvalidCloseStatusCodesTo = 999;
34+
#endif
3035

3136
// [0x21, 0x7E] except separators "()<>@,;:\\\"/[]?={} ".
3237
private static readonly SearchValues<char> s_validSubprotocolChars =
@@ -84,11 +89,15 @@ internal static void ValidateCloseStatus(WebSocketCloseStatus closeStatus, strin
8489
}
8590

8691
int closeStatusCode = (int)closeStatus;
87-
92+
#if TARGET_BROWSER
93+
// as defined in https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close#code
94+
if (closeStatus != WebSocketCloseStatus.NormalClosure && (closeStatusCode < ValidCloseStatusCodesFrom || closeStatusCode > ValidCloseStatusCodesTo))
95+
#else
8896
if ((closeStatusCode >= InvalidCloseStatusCodesFrom &&
8997
closeStatusCode <= InvalidCloseStatusCodesTo) ||
9098
closeStatusCode == CloseStatusCodeAbort ||
9199
closeStatusCode == CloseStatusCodeFailedTLSHandshake)
100+
#endif
92101
{
93102
// CloseStatus 1006 means Aborted - this will never appear on the wire and is reflected by calling WebSocket.Abort
94103
throw new ArgumentException(SR.Format(SR.net_WebSockets_InvalidCloseStatusCode,

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,11 @@ public static async Task InvokeAsync(HttpContext context)
2424

2525
if (context.Request.QueryString.HasValue && context.Request.QueryString.Value.Contains("delay10sec"))
2626
{
27-
Thread.Sleep(10000);
27+
await Task.Delay(10000);
2828
}
2929
else if (context.Request.QueryString.HasValue && context.Request.QueryString.Value.Contains("delay20sec"))
3030
{
31-
Thread.Sleep(20000);
31+
await Task.Delay(20000);
3232
}
3333

3434
try
@@ -124,14 +124,15 @@ await socket.CloseAsync(
124124
}
125125

126126
bool sendMessage = false;
127+
string receivedMessage = null;
127128
if (receiveResult.MessageType == WebSocketMessageType.Text)
128129
{
129-
string receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, offset);
130+
receivedMessage = Encoding.UTF8.GetString(receiveBuffer, 0, offset);
130131
if (receivedMessage == ".close")
131132
{
132133
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, receivedMessage, CancellationToken.None);
133134
}
134-
if (receivedMessage == ".shutdown")
135+
else if (receivedMessage == ".shutdown")
135136
{
136137
await socket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, receivedMessage, CancellationToken.None);
137138
}
@@ -161,6 +162,14 @@ await socket.SendAsync(
161162
!replyWithPartialMessages,
162163
CancellationToken.None);
163164
}
165+
if (receivedMessage == ".closeafter")
166+
{
167+
await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, receivedMessage, CancellationToken.None);
168+
}
169+
else if (receivedMessage == ".shutdownafter")
170+
{
171+
await socket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, receivedMessage, CancellationToken.None);
172+
}
164173
}
165174
}
166175
}

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

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,24 @@ internal static partial class BrowserInterop
1616
return protocol;
1717
}
1818

19+
public static WebSocketCloseStatus? GetCloseStatus(JSObject? webSocket)
20+
{
21+
if (webSocket == null || webSocket.IsDisposed) return null;
22+
if (!webSocket.HasProperty("close_status"))
23+
{
24+
return null;
25+
}
26+
int status = webSocket.GetPropertyAsInt32("close_status");
27+
return (WebSocketCloseStatus)status;
28+
}
29+
30+
public static string? GetCloseStatusDescription(JSObject? webSocket)
31+
{
32+
if (webSocket == null || webSocket.IsDisposed) return null;
33+
string? description = webSocket.GetPropertyAsString("close_status_description");
34+
return description;
35+
}
36+
1937
public static int GetReadyState(JSObject? webSocket)
2038
{
2139
if (webSocket == null || webSocket.IsDisposed) return -1;
@@ -28,16 +46,14 @@ public static int GetReadyState(JSObject? webSocket)
2846
public static partial JSObject WebSocketCreate(
2947
string uri,
3048
string?[]? subProtocols,
31-
IntPtr responseStatusPtr,
32-
[JSMarshalAs<JSType.Function<JSType.Number, JSType.String>>] Action<int, string> onClosed);
49+
IntPtr responseStatusPtr);
3350

3451
public static unsafe JSObject UnsafeCreate(
3552
string uri,
3653
string?[]? subProtocols,
37-
MemoryHandle responseHandle,
38-
[JSMarshalAs<JSType.Function<JSType.Number, JSType.String>>] Action<int, string> onClosed)
54+
MemoryHandle responseHandle)
3955
{
40-
return WebSocketCreate(uri, subProtocols, (IntPtr)responseHandle.Pointer, onClosed);
56+
return WebSocketCreate(uri, subProtocols, (IntPtr)responseHandle.Pointer);
4157
}
4258

4359
[JSImport("INTERNAL.ws_wasm_open")]
@@ -52,19 +68,9 @@ public static partial Task WebSocketOpen(
5268
int messageType,
5369
bool endOfMessage);
5470

55-
public static unsafe Task? UnsafeSendSync(JSObject jsWs, ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage)
71+
public static unsafe Task? UnsafeSend(JSObject jsWs, MemoryHandle pinBuffer, int length, WebSocketMessageType messageType, bool endOfMessage)
5672
{
57-
if (buffer.Count == 0)
58-
{
59-
return WebSocketSend(jsWs, IntPtr.Zero, 0, (int)messageType, endOfMessage);
60-
}
61-
62-
var span = buffer.AsSpan();
63-
// we can do this because the bytes in the buffer are always consumed synchronously (not later with Task resolution)
64-
fixed (void* spanPtr = span)
65-
{
66-
return WebSocketSend(jsWs, (IntPtr)spanPtr, buffer.Count, (int)messageType, endOfMessage);
67-
}
73+
return WebSocketSend(jsWs, (IntPtr)pinBuffer.Pointer, length, (int)messageType, endOfMessage);
6874
}
6975

7076
[JSImport("INTERNAL.ws_wasm_receive")]
@@ -73,7 +79,7 @@ public static partial Task WebSocketOpen(
7379
IntPtr bufferPtr,
7480
int bufferLength);
7581

76-
public static unsafe Task? ReceiveUnsafeSync(JSObject jsWs, MemoryHandle pinBuffer, int length)
82+
public static unsafe Task? ReceiveUnsafe(JSObject jsWs, MemoryHandle pinBuffer, int length)
7783
{
7884
return WebSocketReceive(jsWs, (IntPtr)pinBuffer.Pointer, length);
7985
}

0 commit comments

Comments
 (0)