async Task CloseOrAbortWebSocketAsync()

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();
                }
            }