Skip to content

Commit 7cd7d06

Browse files
authored
Prevent serializer from finalizing partial websocket message (#89)
1 parent dd56890 commit 7cd7d06

File tree

3 files changed

+15
-7
lines changed

3 files changed

+15
-7
lines changed

src/GraphQL.AspNetCore3/WebSockets/WebSocketConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ protected virtual Task OnDispatchMessageAsync(IOperationMessageProcessor operati
221221
protected virtual async Task OnSendMessageAsync(OperationMessage message)
222222
{
223223
await _serializer.WriteAsync(_stream, message, RequestAborted);
224-
await _stream.FlushAsync(RequestAborted);
224+
await _stream.SendEndOfMessageAsync(RequestAborted);
225225
}
226226

227227
/// <summary>

src/GraphQL.AspNetCore3/WebSockets/WebSocketWriterStream.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@ public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationTo
1919

2020
public override void Write(byte[] buffer, int offset, int count) => WriteAsync(buffer, offset, count).GetAwaiter().GetResult();
2121

22-
public override Task FlushAsync(CancellationToken cancellationToken)
23-
=> _webSocket.SendAsync(new ArraySegment<byte>(Array.Empty<byte>()), WebSocketMessageType.Text, true, cancellationToken);
22+
public override Task FlushAsync(CancellationToken cancellationToken) => Task.CompletedTask;
23+
24+
public override void Flush() { }
2425

25-
public override void Flush() => FlushAsync().GetAwaiter().GetResult();
26+
public Task SendEndOfMessageAsync(CancellationToken cancellationToken)
27+
=> _webSocket.SendAsync(new ArraySegment<byte>(Array.Empty<byte>()), WebSocketMessageType.Text, true, cancellationToken);
2628

2729
public override int Read(byte[] buffer, int offset, int count) => throw new NotSupportedException();
2830

src/Tests/WebSockets/WebSocketWriterStreamTests.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,18 @@ public void Write()
5151
}
5252

5353
[Fact]
54-
public async Task FlushAsync()
54+
public async Task SendEndOfMessageAsync()
5555
{
5656
_mockWebSocket.Setup(x => x.SendAsync(new ArraySegment<byte>(Array.Empty<byte>(), 0, 0), WebSocketMessageType.Text, true, default))
5757
.Returns(Task.CompletedTask).Verifiable();
58+
await _stream.SendEndOfMessageAsync(default);
59+
_mockWebSocket.Verify();
60+
_mockWebSocket.VerifyNoOtherCalls();
61+
}
62+
63+
[Fact]
64+
public async Task FlushAsync()
65+
{
5866
await _stream.FlushAsync();
5967
_mockWebSocket.Verify();
6068
_mockWebSocket.VerifyNoOtherCalls();
@@ -63,8 +71,6 @@ public async Task FlushAsync()
6371
[Fact]
6472
public void Flush()
6573
{
66-
_mockWebSocket.Setup(x => x.SendAsync(new ArraySegment<byte>(Array.Empty<byte>(), 0, 0), WebSocketMessageType.Text, true, default))
67-
.Returns(Task.CompletedTask).Verifiable();
6874
_stream.Flush();
6975
_mockWebSocket.Verify();
7076
_mockWebSocket.VerifyNoOtherCalls();

0 commit comments

Comments
 (0)