225 if (!connectionState.TryAddStream(
this))
229 _state.ConnectionState = connectionState;
230 _state.Handle = streamHandle;
250 System.
Net.
NetEventSource.
Info(
_state, $
"{TraceId()} Inbound {(flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL) ? "uni
" : "bi
")}directional stream created in connection {_state.ConnectionState.TraceId}.",
".ctor");
256 if (!connectionState.TryAddStream(
this))
260 _state.ConnectionState = connectionState;
284 System.
Net.
NetEventSource.
Info(
_state, $
"{_state.TraceId} Outbound {(flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL) ? "uni
" : "bi
")}directional stream created in connection {_state.ConnectionState.TraceId}.",
".ctor");
447 _state.Stream =
this;
448 _state.ReadState =
ReadState.PendingRead;
481 _state.ReadState =
ReadState.ReadsCompleted;
498 if (sourceBuffers.
Length == 0)
510 destinationBuffer = destinationBuffer.
Slice(num);
512 while (destinationBuffer.
Length != 0 && ++num2 < sourceBuffers.
Length);
645 cancellationTokenSource?.
Dispose();
667 cancellationTokenSource?.
Dispose();
788 return evt.Type
switch
822 switch (
state.ReadState)
826 if ((uint)
state.ReceiveQuicBuffers.Length < receive.BufferCount)
830 if (receiveQuicBuffers.Length != 0)
835 for (uint num2 = 0u; num2 < receive.BufferCount; num2++)
837 state.ReceiveQuicBuffers[num2] = receive.Buffers[num2];
839 state.ReceiveQuicBuffersCount = (int)receive.BufferCount;
840 state.ReceiveQuicBuffersTotalBytes = checked((
int)receive.TotalBufferLength);
842 if (
state.ReceiveQuicBuffersTotalBytes == 0)
844 if (
state.ReceiveIsFinal)
846 state.ReadState =
ReadState.ReadsCompleted;
850 state.ReadState =
ReadState.IndividualReadComplete;
854 state.ReceiveCancellationRegistration.Unregister();
859 if (receive.Flags.HasFlag(
QUIC_RECEIVE_FLAGS.FIN) && (uint)num == receive.TotalBufferLength)
861 state.ReadState =
ReadState.ReadsCompleted;
863 state.ReceiveUserBuffer =
null;
871 state.ReceiveResettableCompletionSource.Complete(num);
873 uint result = (((uint)num != receive.TotalBufferLength) ? 459998u : 0u);
874 receive.TotalBufferLength = (uint)num;
894 state.SendErrorCode = evt.Data.PeerReceiveAborted.ErrorCode;
914 if (evt.Data.SendShutdownComplete.Graceful != 0)
927 state.ShutdownWriteCompletionSource.SetResult();
963 state.ReceiveResettableCompletionSource.Complete(0);
967 state.ShutdownWriteCompletionSource.SetResult();
971 state.ShutdownCompletionSource.SetResult();
986 state.ReadErrorCode = evt.Data.PeerSendAborted.ErrorCode;
1008 state.ReceiveResettableCompletionSource.Complete(0);
1016 bool flag = sendComplete.Canceled != 0;
1035 state.SendResettableCompletionSource.Complete(0u);
1049 for (
int i = 0; i <
state.SendBufferCount; i++)
1051 state.BufferArrays[i].Dispose();
1070 _state.SendBufferMaxCount = 1;
1073 ptr->Length = (uint)
buffer.Length;
1074 ptr->Buffer = (
byte*)memoryHandle.
Pointer;
1076 _state.SendBufferCount = 1;
1099 while (enumerator.MoveNext())
1109 _state.SendBufferMaxCount = num;
1112 _state.SendBufferCount = num;
1116 while (enumerator2.MoveNext())
1120 ptr[num].Length = (uint)current2.
Length;
1121 ptr[num].Buffer = (
byte*)memoryHandle.
Pointer;
1146 uint num = (uint)
array.Length;
1152 _state.SendBufferMaxCount =
array.Length;
1155 _state.SendBufferCount =
array.Length;
1157 for (
int i = 0; i < num; i++)
1161 ptr[i].Length = (uint)readOnlyMemory.
Length;
1162 ptr[i].Buffer = (
byte*)memoryHandle.
Pointer;
1196 long abortErrorCode =
state.ConnectionState.AbortErrorCode;
1199 System.
Net.
NetEventSource.
Info(
state,
state.TraceId +
" Stream handling connection " +
state.ConnectionState.TraceId +
" close" + ((abortErrorCode != -1) ? $
" with code {abortErrorCode}" :
""),
"HandleEventConnectionClose");
1212 state.SendState =
SendState.ConnectionClosed;
1254 bool result =
false;
1258 state.Stream =
null;
1259 state.ReceiveUserBuffer =
null;
1260 state.ReceiveCancellationRegistration.Unregister();
1264 state.ReadState = finalState;
static ArrayPool< T > Shared
static void SuppressFinalize(object obj)
static byte Min(byte val1, byte val2)
static readonly System.Net.NetEventSource Log
static void Info(object thisOrContextObject, FormattableString formattableString=null, [CallerMemberName] string memberName=null)
static void Error(object thisOrContextObject, FormattableString formattableString, [CallerMemberName] string memberName=null)
static unsafe ulong GetULongParam(MsQuicApi api, SafeHandle nativeObject, QUIC_PARAM_LEVEL level, uint param)
static bool SuccessfulStatusCode(uint status)
static string GetTraceId(SafeMsQuicStreamHandle handle)
static void ThrowIfFailed(uint status, string message=null, Exception innerException=null)
void CompleteException(Exception ex)
ValueTask GetTypelessValueTask()
ValueTask< T > GetValueTask()
readonly ResettableCompletionSource< int > ReceiveResettableCompletionSource
MsQuicNativeMethods.QuicBuffer[] ReceiveQuicBuffers
int ReceiveQuicBuffersTotalBytes
int ReceiveQuicBuffersCount
MsQuicConnection.State ConnectionState
readonly ResettableCompletionSource< uint > SendResettableCompletionSource
ShutdownState ShutdownState
MemoryHandle[] BufferArrays
Memory< byte > ReceiveUserBuffer
SafeMsQuicStreamHandle Handle
readonly TaskCompletionSource ShutdownWriteCompletionSource
ShutdownWriteState ShutdownWriteState
CancellationTokenRegistration ReceiveCancellationRegistration
readonly TaskCompletionSource ShutdownCompletionSource
CancellationTokenRegistration HandleWriteStartState(bool emptyBuffer, CancellationToken cancellationToken)
static uint HandleEventPeerSendShutdown(State state)
override void Write(ReadOnlySpan< byte > buffer)
static unsafe uint HandleEventRecv(State state, ref MsQuicNativeMethods.StreamEvent evt)
override async ValueTask WriteAsync(ReadOnlySequence< byte > buffers, bool endStream, CancellationToken cancellationToken=default(CancellationToken))
override void AbortRead(long errorCode)
void HandleWriteCompletedState()
static uint HandleEventSendComplete(State state, ref MsQuicNativeMethods.StreamEvent evt)
override void AbortWrite(long errorCode)
override async ValueTask WriteAsync(ReadOnlyMemory< byte > buffer, bool endStream, CancellationToken cancellationToken=default(CancellationToken))
unsafe ValueTask SendReadOnlySequenceAsync(ReadOnlySequence< byte > buffers, QUIC_SEND_FLAGS flags)
void Dispose(bool disposing)
override async ValueTask ShutdownCompleted(CancellationToken cancellationToken=default(CancellationToken))
static uint HandleEvent(State state, ref MsQuicNativeMethods.StreamEvent evt)
override bool ReadsCompleted
static uint HandleEventPeerRecvAborted(State state, ref MsQuicNativeMethods.StreamEvent evt)
static void CleanupSendState(State state)
override ValueTask< int > ReadAsync(Memory< byte > destination, CancellationToken cancellationToken=default(CancellationToken))
static uint HandleEventSendShutdownComplete(State state, ref MsQuicNativeMethods.StreamEvent evt)
override ValueTask WriteAsync(ReadOnlyMemory< byte > buffer, CancellationToken cancellationToken=default(CancellationToken))
override ValueTask WriteAsync(ReadOnlyMemory< ReadOnlyMemory< byte > > buffers, CancellationToken cancellationToken=default(CancellationToken))
static Exception GetConnectionAbortedException(State state)
unsafe ValueTask SendReadOnlyMemoryListAsync(ReadOnlyMemory< ReadOnlyMemory< byte > > buffers, QUIC_SEND_FLAGS flags)
MsQuicStream(MsQuicConnection.State connectionState, QUIC_STREAM_OPEN_FLAGS flags)
static uint HandleEventShutdownComplete(State state, ref MsQuicNativeMethods.StreamEvent evt)
override ValueTask WriteAsync(ReadOnlySequence< byte > buffers, CancellationToken cancellationToken=default(CancellationToken))
override ValueTask DisposeAsync()
override int WriteTimeout
void StartShutdown(QUIC_STREAM_SHUTDOWN_FLAGS flags, long errorCode)
static uint HandleEventConnectionClose(State state)
static readonly MsQuicNativeMethods.StreamCallbackDelegate s_streamDelegate
override Task FlushAsync(CancellationToken cancellationToken=default(CancellationToken))
override ValueTask WaitForWriteCompletionAsync(CancellationToken cancellationToken=default(CancellationToken))
unsafe ValueTask SendReadOnlyMemoryAsync(ReadOnlyMemory< byte > buffer, QUIC_SEND_FLAGS flags)
static uint HandleEventPeerSendAborted(State state, ref MsQuicNativeMethods.StreamEvent evt)
static unsafe int CopyMsQuicBuffersToUserBuffer(ReadOnlySpan< MsQuicNativeMethods.QuicBuffer > sourceBuffers, Span< byte > destinationBuffer)
override async ValueTask WriteAsync(ReadOnlyMemory< ReadOnlyMemory< byte > > buffers, bool endStream, CancellationToken cancellationToken=default(CancellationToken))
void ReceiveComplete(int bufferLength)
MsQuicStream(MsQuicConnection.State connectionState, SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags)
void HandleWriteFailedState()
static bool CleanupReadStateAndCheckPending(State state, ReadState finalState)
static uint NativeCallbackHandler(IntPtr stream, IntPtr context, ref MsQuicNativeMethods.StreamEvent streamEvent)
override int Read(Span< byte > buffer)
static uint HandleEventStartComplete(State state, ref MsQuicNativeMethods.StreamEvent evt)
static Exception GetStreamAbortedException(long errorCode)
static Exception GetConnectionAbortedException(long errorCode)
static Exception SetCurrentStackTrace(Exception source)
static void FreeHGlobal(IntPtr hglobal)
static IntPtr AllocHGlobal(int cb)
static string net_quic_writing_notallowed
static string net_quic_timeout_use_gt_zero
static string net_quic_sending_aborted
static string net_quic_reading_notallowed
static string net_quic_timeout
static int Exchange(ref int location1, int value)
void SetException(Exception exception)
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
new Task< TResult > WaitAsync(CancellationToken cancellationToken)
static Task CompletedTask
new TaskAwaiter< TResult > GetAwaiter()
QUIC_STREAM_SHUTDOWN_FLAGS
static readonly IntPtr Zero
unsafe MemoryHandle Pin()
static IntPtr ToIntPtr(GCHandle value)
static GCHandle Alloc(object? value)
static GCHandle FromIntPtr(IntPtr value)
void CopyTo(Span< T > destination)
Span< T > Slice(int start)
static ValueTask FromException(Exception exception)