public async Task HandlesAWebSocketRequest()
        {
            HttpContext httpContext = this.ContextWithRequestedSubprotocols("abc");

            var listener = Mock.Of <IWebSocketListener>(wsl => wsl.SubProtocol == "abc");

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener);

            var middleware = new WebSocketHandlingMiddleware(this.ThrowingNextDelegate(), registry, Task.FromResult(Mock.Of <IHttpProxiedCertificateExtractor>()));
            await middleware.Invoke(httpContext);

            Mock.Get(listener).Verify(r => r.ProcessWebSocketRequestAsync(It.IsAny <WebSocket>(), It.IsAny <Option <EndPoint> >(), It.IsAny <EndPoint>(), It.IsAny <string>()));
        }
        public async Task AuthorizedRequestWhenProxyAuthSuccess()
        {
            var next = Mock.Of <RequestDelegate>();

            var listener = new Mock <IWebSocketListener>();

            listener.Setup(wsl => wsl.SubProtocol).Returns("abc");
            listener.Setup(
                wsl => wsl.ProcessWebSocketRequestAsync(
                    It.IsAny <WebSocket>(),
                    It.IsAny <Option <EndPoint> >(),
                    It.IsAny <EndPoint>(),
                    It.IsAny <string>(),
                    It.IsAny <X509Certificate2>(),
                    It.IsAny <IList <X509Certificate2> >(),
                    It.Is <IAuthenticator>(auth => auth == null)))
            .Returns(Task.CompletedTask);

            var registry = new WebSocketListenerRegistry();

            registry.TryRegister(listener.Object);
            var    certContentBytes  = Util.Test.Common.CertificateHelper.GenerateSelfSignedCert($"test_cert").Export(X509ContentType.Cert);
            string certContentBase64 = Convert.ToBase64String(certContentBytes);
            string clientCertString  = $"-----BEGIN CERTIFICATE-----\n{certContentBase64}\n-----END CERTIFICATE-----\n";

            clientCertString = WebUtility.UrlEncode(clientCertString);
            HttpContext httpContext   = this.ContextWithRequestedSubprotocolsAndForwardedCert(new StringValues(clientCertString), "abc");
            var         certExtractor = new Mock <IHttpProxiedCertificateExtractor>();

            certExtractor.Setup(p => p.GetClientCertificate(It.IsAny <HttpContext>())).ReturnsAsync(Option.Some(new X509Certificate2(certContentBytes)));

            var middleware = new WebSocketHandlingMiddleware(next, registry, Task.FromResult(certExtractor.Object));
            await middleware.Invoke(httpContext);

            listener.VerifyAll();
        }