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

◆ WriteSingleChunk< TIOAdapter >()

ValueTask System.Net.Security.SslStream.WriteSingleChunk< TIOAdapter > ( TIOAdapter writeAdapter,
ReadOnlyMemory< byte > buffer )
inlineprivate
Type Constraints
TIOAdapter :struct 
TIOAdapter :IReadWriteAdapter 

Definition at line 1384 of file SslStream.cs.

1384 : struct, IReadWriteAdapter
1385 {
1386 byte[] array = ArrayPool<byte>.Shared.Rent(buffer.Length + 64);
1387 byte[] outBuffer = array;
1388 SecurityStatusPal status;
1389 int outSize;
1390 while (true)
1391 {
1392 status = EncryptData(buffer, ref outBuffer, out outSize);
1393 if (status.ErrorCode != SecurityStatusPalErrorCode.TryAgain)
1394 {
1395 break;
1396 }
1398 if (handshakeWaiter != null)
1399 {
1400 Task task = writeAdapter.WaitAsync(handshakeWaiter);
1401 if (!task.IsCompletedSuccessfully)
1402 {
1403 return WaitAndWriteAsync(writeAdapter, buffer, task, array);
1404 }
1405 }
1406 }
1407 if (status.ErrorCode != SecurityStatusPalErrorCode.OK)
1408 {
1411 }
1412 ValueTask valueTask = writeAdapter.WriteAsync(outBuffer, 0, outSize);
1413 if (valueTask.IsCompletedSuccessfully)
1414 {
1416 return valueTask;
1417 }
1418 return CompleteWriteAsync(valueTask, array);
1419 static async ValueTask CompleteWriteAsync(ValueTask writeTask, byte[] bufferToReturn)
1420 {
1421 try
1422 {
1423 await writeTask.ConfigureAwait(continueOnCapturedContext: false);
1424 }
1425 finally
1426 {
1427 ArrayPool<byte>.Shared.Return(bufferToReturn);
1428 }
1429 }
1430 async ValueTask WaitAndWriteAsync(TIOAdapter writeAdapter, ReadOnlyMemory<byte> buffer, Task waitTask, byte[] rentedBuffer)
1431 {
1432 byte[] bufferToReturn2 = rentedBuffer;
1433 byte[] outBuffer2 = rentedBuffer;
1434 try
1435 {
1436 await waitTask.ConfigureAwait(continueOnCapturedContext: false);
1437 int outSize2;
1438 SecurityStatusPal status2 = EncryptData(buffer, ref outBuffer2, out outSize2);
1439 if (status2.ErrorCode == SecurityStatusPalErrorCode.TryAgain)
1440 {
1441 byte[] array2 = bufferToReturn2;
1442 bufferToReturn2 = null;
1443 ArrayPool<byte>.Shared.Return(array2);
1444 await WriteSingleChunk(writeAdapter, buffer).ConfigureAwait(continueOnCapturedContext: false);
1445 }
1446 else
1447 {
1448 if (status2.ErrorCode != SecurityStatusPalErrorCode.OK)
1449 {
1450 throw new IOException(System.SR.net_io_encrypt, SslStreamPal.GetException(status2));
1451 }
1452 await writeAdapter.WriteAsync(outBuffer2, 0, outSize2).ConfigureAwait(continueOnCapturedContext: false);
1453 }
1454 }
1455 finally
1456 {
1457 if (bufferToReturn2 != null)
1458 {
1459 ArrayPool<byte>.Shared.Return(bufferToReturn2);
1460 }
1461 }
1462 }
1463 }
static ArrayPool< T > Shared
Definition ArrayPool.cs:7
SecurityStatusPal EncryptData(ReadOnlyMemory< byte > buffer, ref byte[] outBuffer, out int outSize)
Definition SslStream.cs:992
volatile TaskCompletionSource< bool > _handshakeWaiter
Definition SslStream.cs:72
static string net_io_encrypt
Definition SR.cs:32
Definition SR.cs:7
new ConfiguredTaskAwaitable< TResult > ConfigureAwait(bool continueOnCapturedContext)
Definition Task.cs:226
new Task< TResult > WaitAsync(CancellationToken cancellationToken)
Definition Task.cs:231
ConfiguredValueTaskAwaitable ConfigureAwait(bool continueOnCapturedContext)
Definition ValueTask.cs:312
static ValueTask FromException(Exception exception)
Definition ValueTask.cs:190

References System.Net.Security.SslStream._handshakeWaiter, System.array, System.buffer, System.Threading.Tasks.Task< TResult >.ConfigureAwait(), System.Threading.Tasks.ValueTask< TResult >.ConfigureAwait(), System.Net.Security.SslStream.EncryptData(), System.Net.SecurityStatusPal.ErrorCode, System.Threading.Tasks.ValueTask< TResult >.FromException(), System.Net.Security.SslStreamPal.GetException(), System.Threading.Tasks.ValueTask< TResult >.IsCompletedSuccessfully, System.SR.net_io_encrypt, System.Runtime.ExceptionServices.ExceptionDispatchInfo.SetCurrentStackTrace(), System.Buffers.ArrayPool< T >.Shared, System.task, and System.Threading.Tasks.Task< TResult >.WaitAsync().