Example #1
0
        public async Task Invoke(HttpContext context)
        {
            if (!_wsPorts.Contains(context.Connection.LocalPort))
            {
                await _next.Invoke(context);

                return;
            }

            if (!context.WebSockets.IsWebSocketRequest)
            {
                // Do not continue in the ASP.NET pipeline if this is not a websocket request.
                context.Response.StatusCode = StatusCodes.Status400BadRequest;
                return;
            }

            var webSocket = await context.WebSockets.AcceptWebSocketAsync("lime");

            using var transport = new ServerWebSocketTransport(
                      context,
                      webSocket,
                      _envelopeSerializer);

            await transport.OpenAsync(null, context.RequestAborted);

            await _listener.ListenAsync(transport, context.RequestAborted);
        }
        public void ReadAsyncThrowsWhenBufferIsNull()
        {
            var webSocket       = new Mock <WebSocket>();
            var serverTransport = new ServerWebSocketTransport(webSocket.Object, "local", "remote", Guid.NewGuid().ToString());

            Assert.Throws <ArgumentNullException>(() => serverTransport.ReadAsync(new TransportAsyncCallbackArgs()));
        }
        public void ReadAsyncThrowsWhenSocketNotOpen()
        {
            var webSocket = new Mock <WebSocket>();

            webSocket.SetupSequence(ws => ws.State)
            .Returns(WebSocketState.Aborted)
            .Returns(WebSocketState.Closed)
            .Returns(WebSocketState.CloseSent)
            .Returns(WebSocketState.CloseReceived)
            .Returns(WebSocketState.None);
            var serverTransport = new ServerWebSocketTransport(webSocket.Object,
                                                               "local",
                                                               "remote",
                                                               Guid.NewGuid().ToString());

            var args = new TransportAsyncCallbackArgs();

            args.SetBuffer(new byte[4], 0, 4);
            args.CompletedCallback += delegate(TransportAsyncCallbackArgs callbackArgs) { };
            Assert.Throws <ObjectDisposedException>(() => serverTransport.ReadAsync(args));
            Assert.Throws <ObjectDisposedException>(() => serverTransport.ReadAsync(args));
            Assert.Throws <ObjectDisposedException>(() => serverTransport.ReadAsync(args));
            Assert.Throws <ObjectDisposedException>(() => serverTransport.ReadAsync(args));
            Assert.Throws <AmqpException>(() => serverTransport.ReadAsync(args));
        }
        public void ReadAsyncThrowsWhenBufferLimits()
        {
            var webSocket = new Mock <WebSocket>();

            webSocket.Setup(ws => ws.State)
            .Returns(WebSocketState.Open);

            var serverTransport = new ServerWebSocketTransport(webSocket.Object,
                                                               "local",
                                                               "remote",
                                                               Guid.NewGuid().ToString());

            var args = new TransportAsyncCallbackArgs();

            args.SetBuffer(new byte[4], -1, 4);
            args.CompletedCallback += delegate { };
            Assert.Throws <ArgumentOutOfRangeException>(() => serverTransport.ReadAsync(args));

            args.SetBuffer(new byte[4], 5, 9);
            Assert.Throws <ArgumentOutOfRangeException>(() => serverTransport.ReadAsync(args));

            args.SetBuffer(new byte[4], 2, -1);
            Assert.Throws <ArgumentOutOfRangeException>(() => serverTransport.ReadAsync(args));

            args.SetBuffer(new byte[4], 2, 3);
            Assert.Throws <ArgumentOutOfRangeException>(() => serverTransport.ReadAsync(args));
        }
        public void WriteBufferListAsyncSuccess()
        {
            var webSocket = new Mock <WebSocket>();

            webSocket.Setup(ws => ws.State)
            .Returns(WebSocketState.Open);
            webSocket.Setup(ws => ws.SendAsync(It.IsAny <ArraySegment <byte> >(), It.IsAny <WebSocketMessageType>(), It.IsAny <bool>(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new WebSocketReceiveResult(2, WebSocketMessageType.Text, true)));

            var serverTransport = new ServerWebSocketTransport(
                webSocket.Object,
                "local",
                "remote",
                Guid.NewGuid().ToString());

            var args = new TransportAsyncCallbackArgs();

            args.SetBuffer(new List <ByteBuffer> {
                new ByteBuffer(new byte[4]), new ByteBuffer(new byte[5])
            });
            args.CompletedCallback += obj => { };

            Assert.False(serverTransport.WriteAsync(args));
            webSocket.Verify(ws => ws.SendAsync(It.IsAny <ArraySegment <byte> >(), It.IsAny <WebSocketMessageType>(), It.IsAny <bool>(), It.IsAny <CancellationToken>()), Times.Exactly(2));
        }
        public void ValidCtorWithCertTestsSucceeds()
        {
            var webSocket = new Mock <WebSocket>();
            var guid      = Guid.NewGuid().ToString();
            var swst      = new ServerWebSocketTransport(webSocket.Object, "local", "remote", guid, clientCert, clientCertChain, authenticator, credentialsProvider);

            Assert.NotNull(swst.Principal);
        }
        public void ReadAsyncThrowsWhenCompletedCallbackIsNull()
        {
            var webSocket       = new Mock <WebSocket>();
            var serverTransport = new ServerWebSocketTransport(webSocket.Object, "local", "remote", Guid.NewGuid().ToString());

            var args = new TransportAsyncCallbackArgs();

            args.SetBuffer(new byte[4], 0, 4);
            Assert.Throws <ArgumentNullException>(() => serverTransport.ReadAsync(args));
        }
        public void ReadAsyncSuccess()
        {
            var webSocket = new Mock <WebSocket>();

            webSocket.Setup(ws => ws.State)
            .Returns(WebSocketState.Open);
            webSocket.Setup(ws => ws.ReceiveAsync(It.IsAny <ArraySegment <byte> >(), It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(new WebSocketReceiveResult(2, WebSocketMessageType.Text, true)));

            var serverTransport = new ServerWebSocketTransport(webSocket.Object, "local", "remote", Guid.NewGuid().ToString());

            var args = new TransportAsyncCallbackArgs();

            args.SetBuffer(new byte[4], 0, 4);
            args.CompletedCallback += delegate { };

            Assert.False(serverTransport.ReadAsync(args));
            webSocket.VerifyAll();
        }