@@ -39,22 +39,28 @@ public static ValueTask SendAsync(this WebSocket webSocket, ReadOnlySequence<byt
39
39
private static async ValueTask SendMultiSegmentAsync ( WebSocket webSocket , ReadOnlySequence < byte > buffer , WebSocketMessageType webSocketMessageType , CancellationToken cancellationToken = default )
40
40
{
41
41
var position = buffer . Start ;
42
+ // Get a segment before the loop so we can be one segment behind while writing
43
+ // This allows us to do a non-zero byte write for the endOfMessage = true send
44
+ buffer . TryGet ( ref position , out var prevSegment ) ;
42
45
while ( buffer . TryGet ( ref position , out var segment ) )
43
46
{
44
47
#if NETCOREAPP3_0
45
- await webSocket . SendAsync ( segment , webSocketMessageType , endOfMessage : false , cancellationToken ) ;
48
+ await webSocket . SendAsync ( prevSegment , webSocketMessageType , endOfMessage : false , cancellationToken ) ;
46
49
#else
47
- var isArray = MemoryMarshal . TryGetArray ( segment , out var arraySegment ) ;
50
+ var isArray = MemoryMarshal . TryGetArray ( prevSegment , out var arraySegment ) ;
48
51
Debug . Assert ( isArray ) ;
49
52
await webSocket . SendAsync ( arraySegment , webSocketMessageType , endOfMessage : false , cancellationToken ) ;
50
53
#endif
54
+ prevSegment = segment ;
51
55
}
52
56
53
- // Empty end of message frame
57
+ // End of message frame
54
58
#if NETCOREAPP3_0
55
- await webSocket . SendAsync ( Memory < byte > . Empty , webSocketMessageType , endOfMessage : true , cancellationToken ) ;
59
+ await webSocket . SendAsync ( prevSegment , webSocketMessageType , endOfMessage : true , cancellationToken ) ;
56
60
#else
57
- await webSocket . SendAsync ( new ArraySegment < byte > ( Array . Empty < byte > ( ) ) , webSocketMessageType , endOfMessage : true , cancellationToken ) ;
61
+ var isArrayEnd = MemoryMarshal . TryGetArray ( prevSegment , out var arraySegmentEnd ) ;
62
+ Debug . Assert ( isArrayEnd ) ;
63
+ await webSocket . SendAsync ( arraySegmentEnd , webSocketMessageType , endOfMessage : true , cancellationToken ) ;
58
64
#endif
59
65
}
60
66
}
0 commit comments