Skip to content

Commit 7aef162

Browse files
Added support for messages longer than 512 bytes. (#25)
Only expand buffer if we run out of space.
1 parent 34f4f0d commit 7aef162

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

src/Tests/WebSocketChannelTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,24 @@ public async Task EchoChannelWorks()
3737
server.Dispose();
3838
}
3939

40+
[Fact]
41+
public async Task EchoChannelWorksWithLongerText()
42+
{
43+
using var server = WebSocketServer.Create(EchoChannel);
44+
using var client = new ClientWebSocket();
45+
await client.ConnectAsync(server.Uri, CancellationToken.None);
46+
47+
var channel = WebSocketChannel.Create(client);
48+
49+
var longtext = new string('a', 1000000);
50+
await channel.Writer.WriteAsync(Encoding.UTF8.GetBytes(longtext).AsMemory());
51+
52+
var value = await channel.Reader.ReadAsync();
53+
54+
Assert.Equal(longtext, Encoding.UTF8.GetString(value.Span));
55+
server.Dispose();
56+
}
57+
4058
[Fact]
4159
public async Task EchoWorksWithTryWrite()
4260
{

src/WebSocketChannel/WebSocketChannel.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,14 @@ async ValueTask<ReadOnlyMemory<byte>> ReadCoreAsync(CancellationToken cancellati
249249
if (received.Count == 0)
250250
break;
251251

252-
received = await channel.webSocket.ReceiveAsync(memoryOwner.Memory.Slice(count), cancellation).ConfigureAwait(false);
252+
if (!received.EndOfMessage && count >= memoryOwner.Memory.Length)
253+
{
254+
var tempMem = memoryOwner.Memory.Slice(0, count);
255+
memoryOwner = MemoryPool<byte>.Shared.Rent(count + 512);
256+
tempMem.CopyTo(memoryOwner.Memory);
257+
}
258+
259+
received = await channel.webSocket.ReceiveAsync(memoryOwner.Memory.Slice(count, memoryOwner.Memory.Length - count), cancellation).ConfigureAwait(false);
253260
count += received.Count;
254261
}
255262

0 commit comments

Comments
 (0)