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

◆ Process()

async Task< WebSocketReceiveResult > System.Net.WebSockets.WebSocketBase.WebSocketOperation.Process ( ArraySegment< byte >? buffer,
CancellationToken cancellationToken )
inlinepackageinherited

Definition at line 271 of file WebSocketBase.cs.

272 {
273 bool sessionHandleLockTaken = false;
275 ReceiveResult = null;
276 try
277 {
282 {
283 bool completed = false;
284 while (!completed)
285 {
286 global::Interop.WebSocket.Buffer[] array = new global::Interop.WebSocket.Buffer[BufferCount];
287 uint dataBufferCount = (uint)BufferCount;
289 WebSocketProtocolComponent.WebSocketGetAction(_webSocket, ActionQueue, array, ref dataBufferCount, out var action, out var bufferType, out var actionContext);
290 switch (action)
291 {
292 case WebSocketProtocolComponent.Action.NoAction:
294 {
295 bool thisLockTaken = false;
296 try
297 {
299 {
301 bool flag;
302 try
303 {
305 }
306 catch (Exception)
307 {
309 throw;
310 }
311 if (flag)
312 {
315 }
316 }
318 }
319 finally
320 {
321 if (thisLockTaken)
322 {
324 }
325 }
326 }
327 completed = true;
328 break;
329 case WebSocketProtocolComponent.Action.IndicateReceiveComplete:
331 break;
332 case WebSocketProtocolComponent.Action.ReceiveFromNetwork:
333 {
334 int count = 0;
335 try
336 {
339 HttpWebSocket.ThrowIfConnectionAborted(_webSocket._innerStream, read: true);
340 try
341 {
343 count = await task.SuppressContextFlow();
345 }
346 catch (ObjectDisposedException innerException)
347 {
348 throw new WebSocketException(WebSocketError.ConnectionClosedPrematurely, innerException);
349 }
350 catch (NotSupportedException innerException2)
351 {
352 throw new WebSocketException(WebSocketError.ConnectionClosedPrematurely, innerException2);
353 }
356 if (count == 0)
357 {
358 throw new WebSocketException(WebSocketError.ConnectionClosedPrematurely);
359 }
360 }
361 finally
362 {
363 WebSocketProtocolComponent.WebSocketCompleteAction(_webSocket, actionContext, count);
364 }
365 break;
366 }
367 case WebSocketProtocolComponent.Action.IndicateSendComplete:
368 WebSocketProtocolComponent.WebSocketCompleteAction(_webSocket, actionContext, 0);
373 break;
374 case WebSocketProtocolComponent.Action.SendToNetwork:
375 {
376 int bytesSent = 0;
377 try
378 {
379 if ((_webSocket.State != WebSocketState.CloseSent || (bufferType != WebSocketProtocolComponent.BufferType.PingPong && bufferType != WebSocketProtocolComponent.BufferType.UnsolicitedPong)) && dataBufferCount != 0)
380 {
382 int sendBufferSize2 = 0;
384 list.Add(item);
386 if (dataBufferCount == 2)
387 {
389 list.Add(item2);
391 }
393 HttpWebSocket.ThrowIfConnectionAborted(_webSocket._innerStream, read: false);
394 await _webSocket.SendFrameAsync(list, cancellationToken).SuppressContextFlow();
397 bytesSent += sendBufferSize2;
399 }
400 }
401 finally
402 {
403 WebSocketProtocolComponent.WebSocketCompleteAction(_webSocket, actionContext, bytesSent);
404 }
405 break;
406 }
407 default:
408 throw new InvalidOperationException();
409 }
410 }
413 }
414 }
415 finally
416 {
417 Cleanup();
419 }
420 return ReceiveResult;
421 }
void Add(TKey key, TValue value)
Task FlushAsync()
Definition Stream.cs:669
Task< int > ReadAsync(byte[] buffer, int offset, int count)
Definition Stream.cs:762
virtual void ProcessAction_IndicateReceiveComplete(ArraySegment< byte >? buffer, WebSocketProtocolComponent.BufferType bufferType, WebSocketProtocolComponent.Action action, global::Interop.WebSocket.Buffer[] dataBuffers, uint dataBufferCount, IntPtr actionContext)
void Initialize(ArraySegment< byte >? buffer, CancellationToken cancellationToken)
WebSocketProtocolComponent.ActionQueue ActionQueue
bool ShouldContinue(CancellationToken cancellationToken)
void FinishOnCloseReceived(WebSocketCloseStatus closeStatus, string closeStatusDescription)
static void ReleaseLock(object lockObject, ref bool lockTaken)
readonly WebSocketBuffer _internalBuffer
bool StartOnCloseReceived(ref bool thisLockTaken)
readonly KeepAliveTracker _keepAliveTracker
void ResetFlagAndTakeLock(object lockObject, ref bool thisLockTaken)
async Task SendFrameAsync(IList< ArraySegment< byte > > sendBuffers, CancellationToken cancellationToken)
async Task< bool > StartOnCloseCompleted(bool thisLockTakenSnapshot, bool sessionHandleLockTakenSnapshot, CancellationToken cancellationToken)
ArraySegment< byte > ConvertPinnedSendPayloadFromNative(global::Interop.WebSocket.Buffer buffer, WebSocketProtocolComponent.BufferType bufferType)
bool IsPinnedSendPayloadBuffer(byte[] buffer, int offset, int count)
ArraySegment< byte > ConvertNativeBuffer(WebSocketProtocolComponent.Action action, global::Interop.WebSocket.Buffer buffer, WebSocketProtocolComponent.BufferType bufferType)
static void Enter(object obj)
void ICollection< T >. Add(T item)

References System.Net.WebSockets.WebSocketBase._innerStream, System.Net.WebSockets.WebSocketBase._internalBuffer, System.Net.WebSockets.WebSocketBase._keepAliveTracker, System.Net.WebSockets.WebSocketBase._thisLock, System.Net.WebSockets.WebSocketBase.WebSocketOperation._webSocket, System.action, System.Net.WebSockets.WebSocketBase.WebSocketOperation.ActionQueue, System.ArraySegment< T >.Add(), System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.array, System.Net.WebSockets.WebSocketBase.WebSocketOperation.AsyncOperationCompleted, System.buffer, System.Net.WebSockets.WebSocketBase.WebSocketOperation.BufferCount, System.cancellationToken, System.Net.WebSockets.WebSocketBase.WebSocketOperation.Cleanup(), System.Net.WebSockets.WebSocketReceiveResult.CloseStatus, System.Net.WebSockets.WebSocketReceiveResult.CloseStatusDescription, System.Net.WebSockets.WebSocketBuffer.ConvertNativeBuffer(), System.Net.WebSockets.WebSocketBuffer.ConvertPinnedSendPayloadFromNative(), System.count, System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Threading.Monitor.Enter(), System.Net.WebSockets.WebSocketBase.FinishOnCloseCompleted(), System.Net.WebSockets.WebSocketBase.FinishOnCloseReceived(), System.IO.Stream.FlushAsync(), System.Net.WebSockets.WebSocketBase.WebSocketOperation.Initialize(), System.Net.WebSockets.WebSocketBuffer.IsPinnedSendPayloadBuffer(), System.item, System.list, System.Net.WebSockets.WebSocketBase.KeepAliveTracker.OnDataReceived(), System.Net.WebSockets.WebSocketBase.KeepAliveTracker.OnDataSent(), System.Net.WebSockets.WebSocketBase.WebSocketOperation.ProcessAction_IndicateReceiveComplete(), System.Net.WebSockets.WebSocketBase.WebSocketOperation.ProcessAction_NoAction(), System.IO.Stream.ReadAsync(), System.Net.WebSockets.WebSocketBase.WebSocketOperation.ReceiveResult, System.Net.WebSockets.WebSocketBase.ReleaseLock(), System.Net.WebSockets.WebSocketBase.ResetFlagAndTakeLock(), System.Net.WebSockets.WebSocketBase.SendFrameAsync(), System.Net.WebSockets.WebSocketBase.SessionHandle, System.Net.WebSockets.WebSocketBase.WebSocketOperation.ShouldContinue(), System.Net.WebSockets.WebSocketBase.StartOnCloseCompleted(), System.Net.WebSockets.WebSocketBase.StartOnCloseReceived(), System.Net.WebSockets.WebSocketBase.State, System.task, System.Net.WebSockets.HttpWebSocket.ThrowIfConnectionAborted(), System.Net.WebSockets.WebSocketBase.ThrowIfDisposed(), System.Net.WebSockets.WebSocketBase.ThrowIfPendingException(), System.Net.WebSockets.WebSocketProtocolComponent.WebSocketCompleteAction(), and System.Net.WebSockets.WebSocketProtocolComponent.WebSocketGetAction().