Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ HandleReceivedCloseAsync()

async ValueTask System.Net.WebSockets.ManagedWebSocket.HandleReceivedCloseAsync ( MessageHeader header,
CancellationToken cancellationToken )
inlineprivate

Definition at line 1048 of file ManagedWebSocket.cs.

1049 {
1050 lock (StateUpdateLock)
1051 {
1052 _receivedCloseFrame = true;
1053 if (_sentCloseFrame && _state < WebSocketState.Closed)
1054 {
1055 _state = WebSocketState.Closed;
1056 }
1057 else if (_state < WebSocketState.CloseReceived)
1058 {
1059 _state = WebSocketState.CloseReceived;
1060 }
1061 }
1062 WebSocketCloseStatus closeStatus = WebSocketCloseStatus.NormalClosure;
1063 string closeStatusDescription = string.Empty;
1064 if (header.PayloadLength == 1)
1065 {
1066 await CloseWithReceiveErrorAndThrowAsync(WebSocketCloseStatus.ProtocolError, WebSocketError.Faulted).ConfigureAwait(continueOnCapturedContext: false);
1067 }
1068 else if (header.PayloadLength >= 2)
1069 {
1070 if (_receiveBufferCount < header.PayloadLength)
1071 {
1072 await EnsureBufferContainsAsync((int)header.PayloadLength, cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
1073 }
1074 if (_isServer)
1075 {
1076 ApplyMask(_receiveBuffer.Span.Slice(_receiveBufferOffset, (int)header.PayloadLength), header.Mask, 0);
1077 }
1079 if (!IsValidCloseStatus(closeStatus))
1080 {
1081 await CloseWithReceiveErrorAndThrowAsync(WebSocketCloseStatus.ProtocolError, WebSocketError.Faulted).ConfigureAwait(continueOnCapturedContext: false);
1082 }
1083 if (header.PayloadLength > 2)
1084 {
1085 try
1086 {
1087 closeStatusDescription = s_textEncoding.GetString(_receiveBuffer.Span.Slice(_receiveBufferOffset + 2, (int)header.PayloadLength - 2));
1088 }
1089 catch (DecoderFallbackException innerException)
1090 {
1091 await CloseWithReceiveErrorAndThrowAsync(WebSocketCloseStatus.ProtocolError, WebSocketError.Faulted, null, innerException).ConfigureAwait(continueOnCapturedContext: false);
1092 }
1093 }
1094 ConsumeFromBuffer((int)header.PayloadLength);
1095 }
1096 _closeStatus = closeStatus;
1097 _closeStatusDescription = closeStatusDescription;
1098 if (!_isServer && _sentCloseFrame)
1099 {
1100 await WaitForServerToCloseConnectionAsync(cancellationToken).ConfigureAwait(continueOnCapturedContext: false);
1101 }
1102 }
async ValueTask CloseWithReceiveErrorAndThrowAsync(WebSocketCloseStatus closeStatus, WebSocketError error, string errorMessage=null, Exception innerException=null)
static readonly UTF8Encoding s_textEncoding
static bool IsValidCloseStatus(WebSocketCloseStatus closeStatus)
static int ApplyMask(Span< byte > toMask, byte[] mask, int maskOffset, int maskOffsetIndex)
ValueTask EnsureBufferContainsAsync(int minimumRequiredBytes, CancellationToken cancellationToken, bool throwOnPrematureClosure=true)
async ValueTask WaitForServerToCloseConnectionAsync(CancellationToken cancellationToken)
unsafe Span< T > Span
Definition Memory.cs:28
ConfiguredValueTaskAwaitable ConfigureAwait(bool continueOnCapturedContext)
Definition ValueTask.cs:312

References System.Net.WebSockets.ManagedWebSocket._closeStatus, System.Net.WebSockets.ManagedWebSocket._closeStatusDescription, System.Net.WebSockets.ManagedWebSocket._isServer, System.Net.WebSockets.ManagedWebSocket._receiveBuffer, System.Net.WebSockets.ManagedWebSocket._receiveBufferCount, System.Net.WebSockets.ManagedWebSocket._receiveBufferOffset, System.Net.WebSockets.ManagedWebSocket._receivedCloseFrame, System.Net.WebSockets.ManagedWebSocket._sentCloseFrame, System.Net.WebSockets.ManagedWebSocket._state, System.Net.WebSockets.ManagedWebSocket.ApplyMask(), System.cancellationToken, System.Net.WebSockets.ManagedWebSocket.CloseWithReceiveErrorAndThrowAsync(), System.Threading.Tasks.ValueTask< TResult >.ConfigureAwait(), System.Net.WebSockets.ManagedWebSocket.ConsumeFromBuffer(), System.Net.WebSockets.ManagedWebSocket.EnsureBufferContainsAsync(), System.Net.WebSockets.ManagedWebSocket.IsValidCloseStatus(), System.Net.WebSockets.ManagedWebSocket.MessageHeader.Mask, System.Net.WebSockets.ManagedWebSocket.MessageHeader.PayloadLength, System.Net.WebSockets.ManagedWebSocket.s_textEncoding, System.Memory< T >.Span, System.Net.WebSockets.ManagedWebSocket.StateUpdateLock, and System.Net.WebSockets.ManagedWebSocket.WaitForServerToCloseConnectionAsync().

Referenced by System.Net.WebSockets.ManagedWebSocket._003CReceiveAsyncPrivate_003Ed__63< TResult >.MoveNext().