diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ReceiveBuffers.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ReceiveBuffers.cs index c993ee651f463..531ac0171ca07 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ReceiveBuffers.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/Internal/ReceiveBuffers.cs @@ -28,6 +28,14 @@ public void SetFinal() } } + public bool HasCapacity() + { + lock (_syncRoot) + { + return _buffer.ActiveMemory.Length < MaxBufferedBytes; + } + } + public int CopyFrom(ReadOnlySpan quicBuffers, int totalLength, bool final) { lock (_syncRoot) diff --git a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicStream.cs b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicStream.cs index 68199d48d03a7..954d3f4ac8889 100644 --- a/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicStream.cs +++ b/src/libraries/System.Net.Quic/src/System/Net/Quic/QuicStream.cs @@ -509,7 +509,7 @@ private unsafe int HandleEventReceive(ref RECEIVE data) _receiveTcs.TrySetResult(); data.TotalBufferLength = totalCopied; - return QUIC_STATUS_SUCCESS; + return (_receiveBuffers.HasCapacity() && Interlocked.CompareExchange(ref _receivedNeedsEnable, 0, 1) == 1) ? QUIC_STATUS_CONTINUE : QUIC_STATUS_SUCCESS; } private unsafe int HandleEventSendComplete(ref SEND_COMPLETE data) {