Skip to content

Commit af5467f

Browse files
committed
Add WebSocketStream
1 parent 38c8e8f commit af5467f

File tree

8 files changed

+1053
-219
lines changed

8 files changed

+1053
-219
lines changed

src/libraries/Common/tests/StreamConformanceTests/System/IO/StreamConformanceTests.cs

Lines changed: 235 additions & 201 deletions
Large diffs are not rendered by default.

src/libraries/System.Net.WebSockets/ref/System.Net.WebSockets.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,36 @@ public static void RegisterPrefixes() { }
4646
public virtual System.Threading.Tasks.ValueTask SendAsync(System.ReadOnlyMemory<byte> buffer, System.Net.WebSockets.WebSocketMessageType messageType, System.Net.WebSockets.WebSocketMessageFlags messageFlags, System.Threading.CancellationToken cancellationToken) { throw null; }
4747
protected static void ThrowOnInvalidState(System.Net.WebSockets.WebSocketState state, params System.Net.WebSockets.WebSocketState[] validStates) { }
4848
}
49+
public partial class WebSocketStream : System.IO.Stream
50+
{
51+
private protected WebSocketStream() { }
52+
public override System.IAsyncResult BeginWrite(byte[] buffer, int offset, int count, System.AsyncCallback? callback, object? state) { throw null; }
53+
public override System.IAsyncResult BeginRead(byte[] buffer, int offset, int count, System.AsyncCallback? callback, object? state) { throw null; }
54+
public override bool CanRead { get { throw null; } }
55+
public override bool CanSeek { get { throw null; } }
56+
public override bool CanWrite { get { throw null; } }
57+
public static System.Net.WebSockets.WebSocketStream Create(WebSocket webSocket, WebSocketMessageType writeMessageType, bool ownsWebSocket = false) { throw null; }
58+
public static System.Net.WebSockets.WebSocketStream Create(WebSocket webSocket, WebSocketMessageType writeMessageType, TimeSpan closeTimeout) { throw null; }
59+
public static System.Net.WebSockets.WebSocketStream CreateWritableMessageStream(WebSocket webSocket, WebSocketMessageType writeMessageType) { throw null; }
60+
public static System.Net.WebSockets.WebSocketStream CreateReadableMessageStream(WebSocket webSocket) { throw null; }
61+
protected override void Dispose(bool disposing) { }
62+
public override System.Threading.Tasks.ValueTask DisposeAsync() { throw null; }
63+
public override int EndRead(System.IAsyncResult asyncResult) { throw null; }
64+
public override void EndWrite(IAsyncResult asyncResult) { }
65+
public override void Flush() { }
66+
public override System.Threading.Tasks.Task FlushAsync(System.Threading.CancellationToken cancellationToken) { throw null; }
67+
public override long Length { get { throw null; } }
68+
public override long Position { get { throw null; } set { } }
69+
public override int Read(byte[] buffer, int offset, int count) { throw null; }
70+
public override System.Threading.Tasks.Task<int> ReadAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) { throw null; }
71+
public override System.Threading.Tasks.ValueTask<int> ReadAsync(System.Memory<byte> buffer, System.Threading.CancellationToken cancellationToken = default) { throw null; }
72+
public override long Seek(long offset, System.IO.SeekOrigin origin) { throw null; }
73+
public override void SetLength(long value) { }
74+
public System.Net.WebSockets.WebSocket WebSocket { get { throw null; } }
75+
public override void Write(byte[] buffer, int offset, int count) { throw null; }
76+
public override System.Threading.Tasks.Task WriteAsync(byte[] buffer, int offset, int count, System.Threading.CancellationToken cancellationToken) { throw null; }
77+
public override System.Threading.Tasks.ValueTask WriteAsync(System.ReadOnlyMemory<byte> buffer, System.Threading.CancellationToken cancellationToken = default) { throw null; }
78+
}
4979
public enum WebSocketCloseStatus
5080
{
5181
NormalClosure = 1000,

src/libraries/System.Net.WebSockets/src/Resources/Strings.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,9 @@
138138
<data name="net_WebSockets_ArgumentOutOfRange" xml:space="preserve">
139139
<value>The argument must be a value between {0} and {1}.</value>
140140
</data>
141+
<data name="net_WebSockets_TimeoutOutOfRange" xml:space="preserve">
142+
<value>The timeout must be a value between non-negative or Timeout.InfiniteTimeSpan.</value>
143+
</data>
141144
<data name="net_Websockets_KeepAlivePingTimeout" xml:space="preserve">
142145
<value>The WebSocket didn't recieve a Pong frame in response to a Ping frame within the configured KeepAliveTimeout.</value>
143146
</data>

src/libraries/System.Net.WebSockets/src/System.Net.WebSockets.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<Compile Include="System\Net\WebSockets\WebSocketReceiveResult.cs" />
3434
<Compile Include="System\Net\WebSockets\WebSocketState.cs" />
3535
<Compile Include="System\Net\WebSockets\WebSocketStateHelper.cs" />
36+
<Compile Include="System\Net\WebSockets\WebSocketStream.cs" />
3637
<Compile Include="$(CommonPath)System\Net\WebSockets\WebSocketDefaults.cs"
3738
Link="Common\System\Net\WebSockets\WebSocketDefaults.cs" />
3839
<Compile Include="$(CommonPath)System\Net\WebSockets\WebSocketValidate.cs"

src/libraries/System.Net.WebSockets/src/System/Net/WebSockets/ManagedWebSocket.cs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -298,13 +298,7 @@ public override Task SendAsync(ArraySegment<byte> buffer, WebSocketMessageType m
298298
{
299299
if (NetEventSource.Log.IsEnabled()) NetEventSource.Trace(this);
300300

301-
if (messageType != WebSocketMessageType.Text && messageType != WebSocketMessageType.Binary)
302-
{
303-
throw new ArgumentException(SR.Format(
304-
SR.net_WebSockets_Argument_InvalidMessageType,
305-
nameof(WebSocketMessageType.Close), nameof(SendAsync), nameof(WebSocketMessageType.Binary), nameof(WebSocketMessageType.Text), nameof(CloseOutputAsync)),
306-
nameof(messageType));
307-
}
301+
ThrowIfInvalidMessageType(messageType);
308302

309303
WebSocketValidate.ValidateArraySegment(buffer, nameof(buffer));
310304

@@ -318,13 +312,7 @@ public override ValueTask SendAsync(ReadOnlyMemory<byte> buffer, WebSocketMessag
318312
{
319313
if (NetEventSource.Log.IsEnabled()) NetEventSource.Trace(this);
320314

321-
if (messageType != WebSocketMessageType.Text && messageType != WebSocketMessageType.Binary)
322-
{
323-
throw new ArgumentException(SR.Format(
324-
SR.net_WebSockets_Argument_InvalidMessageType,
325-
nameof(WebSocketMessageType.Close), nameof(SendAsync), nameof(WebSocketMessageType.Binary), nameof(WebSocketMessageType.Text), nameof(CloseOutputAsync)),
326-
nameof(messageType));
327-
}
315+
ThrowIfInvalidMessageType(messageType);
328316

329317
try
330318
{
@@ -1901,6 +1889,20 @@ static void LogFaulted(Task task, object? thisObj)
19011889
}
19021890
}
19031891

1892+
internal static void ThrowIfInvalidMessageType(WebSocketMessageType writeMessageType)
1893+
{
1894+
if (writeMessageType is not (WebSocketMessageType.Text or WebSocketMessageType.Binary))
1895+
{
1896+
ThrowInvalidMessageType();
1897+
}
1898+
1899+
static void ThrowInvalidMessageType() =>
1900+
throw new ArgumentException(SR.Format(
1901+
SR.net_WebSockets_Argument_InvalidMessageType,
1902+
nameof(WebSocketMessageType.Close), nameof(SendAsync), nameof(WebSocketMessageType.Binary), nameof(WebSocketMessageType.Text), nameof(CloseOutputAsync)),
1903+
nameof(writeMessageType));
1904+
}
1905+
19041906
private sealed class Utf8MessageState
19051907
{
19061908
internal bool SequenceInProgress;

0 commit comments

Comments
 (0)