Exemplo n.º 1
0
        public async Task ClientCannotUseWrongProtolToConnectServer()
        {
            //Arrange
            const string clientAddress = "ws://localhost:54222/ws";
            const string serverAddress = "https://localhost:54222";

            var config           = NetCoreWebSocketHelper.CreateConfigWithUrl(serverAddress);
            var clientTestPassed = false;

            var serverAction = new Func <HttpContext, Task>(async httpContext =>
            {
                if (httpContext.Request.Path == "/ws")
                {
                    throw new Exception("Should not be able to create web socket connection successfully");
                }
            });

            var logger = new Logger(LogLevel.Debug, null, (logData, _) =>
            {
                var msg = logData.Message;
                _testOutputHelper.WriteLine(msg);
                if ("An exception has occurred while reading an HTTP request/response.".Equals(msg))
                {
                    clientTestPassed = true;
                }
            });

            //Act
            using (var server = NetCoreWebSocketHelper.CreateTestServer(config, _testOutputHelper, serverAction, true))
            {
                await server.StartAsync();

                using (var ws = new WebSocketSharp.WebSocket(clientAddress, logger))
                {
                    var testCompleted = false;
                    ws.OnError += (sender, args) =>
                    {
                        testCompleted = true;
                        Assert.True(args.Exception != null);
                    };

                    ws.OnOpen += (sender, args) =>
                    {
                        testCompleted = true;
                        Assert.True(false, "The connection doesn't use wss url should failed!");
                    };
                    ws.Connect();
                    SpinWait.SpinUntil(() => testCompleted, new TimeSpan(0, 0, 5));
                }
            }

            Assert.True(clientTestPassed);
        }
Exemplo n.º 2
0
        public async Task ClientCanSendModifiedTextWhenReceivedFromServer()
        {
            //Arrange
            const string clientAddress = "wss://localhost:54221/ws";
            const string serverAddress = "https://localhost:54221";

            var          config           = NetCoreWebSocketHelper.CreateConfigWithUrl(serverAddress);
            const string textData         = "Hello World";
            bool         serverTestPassed = false;
            bool         clientTestPassed;

            var serverAction = new Func <HttpContext, Task>(async httpContext =>
            {
                if (httpContext.Request.Path == "/ws")
                {
                    Assert.True(httpContext.WebSockets.IsWebSocketRequest);
                    var webSocket = await httpContext.WebSockets.AcceptWebSocketAsync();

                    var serverBuffer = new byte[1024 * 4];

                    await webSocket.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes(textData)),
                                              WebSocketMessageType.Text, true, CancellationToken.None);

                    var receiveResult =
                        await webSocket.ReceiveAsync(new ArraySegment <byte>(serverBuffer), CancellationToken.None);
                    Assert.True(receiveResult.EndOfMessage);
                    Assert.Equal(WebSocketMessageType.Text, receiveResult.MessageType);

                    var serverRecv = $"{textData} from Https client";
                    Assert.Equal(serverRecv, DataHelper.GetReadableString(serverBuffer));

                    while (!receiveResult.CloseStatus.HasValue)
                    {
                        receiveResult = await webSocket.ReceiveAsync(new ArraySegment <byte>(serverBuffer),
                                                                     CancellationToken.None);
                    }

                    await webSocket.CloseAsync(receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription,
                                               CancellationToken.None);

                    serverTestPassed = true;
                }
            });

            var logger = new Logger(LogLevel.Debug, null, (logData, _) =>
            {
                _testOutputHelper.WriteLine(logData.Message);
            });

            //Act & Assert
            using (var server = NetCoreWebSocketHelper.CreateTestServer(config, _testOutputHelper, serverAction, true))
            {
                await server.StartAsync();

                using (var ws = new WebSocketSharp.WebSocket(clientAddress, logger))
                {
                    var hasComplete = false;
                    ws.OnMessage += (sender, args) =>
                    {
                        Assert.True(args.IsText, "websocket should be text mode");
                        var data = args.Data;
                        Assert.Equal(textData, data);
                        var clientSend = $"{data} from Https client";
                        (sender as WebSocketSharp.WebSocket)?.Send(clientSend);
                        hasComplete = true;
                    };
                    ws.Connect();
                    SpinWait.SpinUntil(() => hasComplete, new TimeSpan(0, 0, 5));
                    Assert.True(hasComplete, "client timeout");
                    ws.Close();
                    clientTestPassed = true;
                }
            }

            Assert.True(serverTestPassed);
            Assert.True(clientTestPassed);
        }
        public async Task TestHttp302Redirect()
        {
            var          originData          = Encoding.UTF8.GetBytes("Hello World");
            const string serverOrigin        = "localhost:54399";
            string       serverOriginAddress = $"http://{serverOrigin}";
            const string serverReal          = "localhost:54400";
            string       serverRealAddress   = $"http://{serverReal}";
            string       clientOriginAddress = $"ws://{serverOrigin}/ws";
            string       clientRealAddress   = $"ws://{serverReal}/ws_new";

            var serverTestComplte = false;

            var configForOrigin = NetCoreWebSocketHelper.CreateConfigWithUrl(serverOriginAddress);
            var configForReal   = NetCoreWebSocketHelper.CreateConfigWithUrl(serverRealAddress);

            var originServerAction = new Func <HttpContext, Task>(async context =>
            {
                if (context.Request.Path == "/ws")
                {
                    Assert.True(context.WebSockets.IsWebSocketRequest);
                    context.Response.Redirect(clientRealAddress);
                }
            });

            var realServerAction = new Func <HttpContext, Task>(async context =>
            {
                if (context.Request.Path == "/ws_new")
                {
                    Assert.True(context.WebSockets.IsWebSocketRequest);
                    var webSocket = await context.WebSockets.AcceptWebSocketAsync().OrTimeout();

                    var serverBuffer  = new byte[originData.Length];
                    var receiveResult =
                        await webSocket.ReceiveAsync(new ArraySegment <byte>(serverBuffer), CancellationToken.None)
                        .OrTimeout();

                    while (!receiveResult.CloseStatus.HasValue)
                    {
                        //Assert
                        Assert.True(receiveResult.EndOfMessage);
                        Assert.Equal(originData.Length, receiveResult.Count);
                        Assert.Equal(WebSocketMessageType.Binary, receiveResult.MessageType);
                        Assert.Equal(originData, serverBuffer);

                        receiveResult =
                            await webSocket.ReceiveAsync(new ArraySegment <byte>(serverBuffer),
                                                         CancellationToken.None).OrTimeout();
                    }

                    await webSocket.CloseAsync(receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription,
                                               CancellationToken.None).OrTimeout();
                    serverTestComplte = true;
                }
            });

            //Act
            using (IWebHost originServer =
                       NetCoreWebSocketHelper.CreateTestServer(configForOrigin, _testOutputHelper, originServerAction),
                   realServer =
                       NetCoreWebSocketHelper.CreateTestServer(configForReal, _testOutputHelper, realServerAction))
            {
                await originServer.StartAsync().OrTimeout();

                await realServer.StartAsync().OrTimeout();

                using (var ws = new WebSocketSharp.WebSocket(clientOriginAddress, CreateWebSocketLogger()))
                {
                    ws.EnableRedirection = true;
                    ws.Connect();
                    Assert.Equal(clientRealAddress, ws.Url.OriginalString);
                    ws.Send(originData);
                    ws.Close();
                }
            }

            Assert.True(serverTestComplte, "server assertion fail");
        }