private StreamBuffer? ReadStreamBuffer => _isInitiator ? _streamState._inboundStreamBuffer : _streamState._outboundStreamBuffer;
- internal override bool CanRead => ReadStreamBuffer is not null;
+ internal override bool CanRead => !_disposed && ReadStreamBuffer is not null;
internal override int Read(Span<byte> buffer)
{
private StreamBuffer? WriteStreamBuffer => _isInitiator ? _streamState._outboundStreamBuffer : _streamState._inboundStreamBuffer;
- internal override bool CanWrite => WriteStreamBuffer is not null;
+ internal override bool CanWrite => !_disposed && WriteStreamBuffer is not null;
internal override void Write(ReadOnlySpan<byte> buffer)
{
{
if (!_disposed)
{
- _disposed = true;
+ Shutdown();
+ _disposed = true;
}
}
{
if (!_disposed)
{
+ Shutdown();
+
_disposed = true;
}
public sealed class MsQuicQuicStreamConformanceTests : QuicStreamConformanceTests
{
protected override QuicImplementationProvider Provider => QuicImplementationProviders.MsQuic;
- }
- public abstract class QuicStreamConformanceTests : ConnectedStreamConformanceTests
- {
// TODO: These are all hanging, likely due to Stream close behavior.
[ActiveIssue("https://github.com/dotnet/runtime/issues/756")]
public override Task Read_Eof_Returns0(ReadWriteMode mode, bool dataAvailableFirst) => base.Read_Eof_Returns0(mode, dataAvailableFirst);
[ActiveIssue("https://github.com/dotnet/runtime/issues/756")]
public override Task Parallel_ReadWriteMultipleStreamsConcurrently() => base.Parallel_ReadWriteMultipleStreamsConcurrently();
+ }
+
+ public abstract class QuicStreamConformanceTests : ConnectedStreamConformanceTests
+ {
protected abstract QuicImplementationProvider Provider { get; }
protected override async Task<StreamPair> CreateConnectedStreamsAsync()