in src/Microsoft.Azure.Relay/HybridConnectionListener.cs [776:812]
async Task CloseOrAbortWebSocketAsync(
Task<WebSocket> connectTask,
bool abort,
WebSocketCloseStatus closeStatus = WebSocketCloseStatus.Empty,
string statusDescription = null,
CancellationToken cancellationToken = default(CancellationToken))
{
Fx.Assert(connectTask != null, "CloseWebSocketAsync was called with null connectTask");
Fx.Assert(connectTask.IsCompleted || !abort, "CloseOrAbortWebSocketAsync(abort=true) should only be called with a completed connectTask");
lock (this.ThisLock)
{
if (object.ReferenceEquals(connectTask, this.connectAsyncTask))
{
this.connectAsyncTask = null;
}
}
WebSocket webSocket = null;
try
{
webSocket = await connectTask.ConfigureAwait(false);
if (abort)
{
webSocket.Abort();
}
else
{
await webSocket.CloseOutputAsync(closeStatus, statusDescription, cancellationToken).ConfigureAwait(false);
await webSocket.CloseAsync(closeStatus, statusDescription, cancellationToken).ConfigureAwait(false);
}
}
catch (Exception e) when (!Fx.IsFatal(e))
{
RelayEventSource.Log.HandledExceptionAsWarning(this.listener, e);
webSocket?.Abort();
}
}