Handle message fragments

This commit is contained in:
David Fowler 2016-10-02 23:41:06 -07:00
parent 1a5138e972
commit e018fe70f7
1 changed files with 22 additions and 9 deletions

View File

@ -35,25 +35,38 @@ namespace Microsoft.AspNetCore.Sockets
_tcs.TrySetResult(null); _tcs.TrySetResult(null);
var buffer = new byte[2048]; var outputBuffer = _channel.Input.Alloc();
while (!_channel.Input.Writing.IsCompleted) while (!_channel.Input.Writing.IsCompleted)
{ {
var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); // Make sure there's room to read (at least 2k)
outputBuffer.Ensure(2048);
// TODO: Fragments ArraySegment<byte> segment;
if (result.MessageType == WebSocketMessageType.Text) if (!outputBuffer.Memory.TryGetArray(out segment))
{ {
await _channel.Input.WriteAsync(new Span<byte>(buffer, 0, result.Count)); // REVIEW: Do we care about native buffers here?
throw new InvalidOperationException("Managed buffers are required for Web Socket API");
} }
else if (result.MessageType == WebSocketMessageType.Binary)
var result = await ws.ReceiveAsync(segment, CancellationToken.None);
if (result.MessageType != WebSocketMessageType.Close)
{ {
await _channel.Input.WriteAsync(new Span<byte>(buffer, 0, result.Count)); outputBuffer.Advance(result.Count);
if (result.EndOfMessage)
{
// Flush when we get an entire message
await outputBuffer.FlushAsync();
// Allocate a new buffer to further writing
outputBuffer = _channel.Input.Alloc();
}
} }
else if (result.MessageType == WebSocketMessageType.Close) else
{ {
await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None); await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);
// TODO: needs to remove itself from connection mamanger?
break; break;
} }
} }