private static void WriteCallback(IAsyncResult transportResult)
{
if (transportResult.CompletedSynchronously)
{
return;
}
AsyncProtocolRequest asyncRequest;
SslState sslState;
#if DEBUG
try
{
#endif
asyncRequest = (AsyncProtocolRequest)transportResult.AsyncState;
sslState = (SslState)asyncRequest.AsyncObject;
#if DEBUG
}
catch (Exception exception) when (!ExceptionCheck.IsFatal(exception))
{
NetEventSource.Fail(null, $"Exception while decoding context: {exception}");
throw;
}
#endif
// Async completion.
try
{
sslState.InnerStream.EndWrite(transportResult);
// Special case for an error notification.
object asyncState = asyncRequest.AsyncState;
ExceptionDispatchInfo exception = asyncState as ExceptionDispatchInfo;
if (exception != null)
{
exception.Throw();
}
sslState.CheckCompletionBeforeNextReceive((ProtocolToken)asyncState, asyncRequest);
}
catch (Exception e)
{
if (asyncRequest.IsUserCompleted)
{
// This will throw on a worker thread.
throw;
}
sslState.FinishHandshake(e, asyncRequest);
}
}