Exemple #1
0
 public void Initialize()
 {
     wsProtocol = new WebSocketProtocol()
     {
         Port = PORT, Address = hostAddress
     };
 }
        private void WebSocket(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                var upgradeFeature = context.Features.Get <IHttpUpgradeFeature>();

                // Generate WebSocket response headers
                string key          = context.Request.Headers[Constants.Headers.SecWebSocketKey].ToString();
                var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key);
                foreach (var headerPair in responseHeaders)
                {
                    context.Response.Headers[headerPair.Key] = headerPair.Value;
                }

                // Upgrade the connection
                Stream opaqueTransport = await upgradeFeature.UpgradeAsync();

                // Get the WebSocket object
                var ws = WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2));

                var appLifetime = app.ApplicationServices.GetRequiredService <IApplicationLifetime>();

                await Echo(ws, appLifetime.ApplicationStopping);
            });
        }
        public static async Task ManagedWebSocket_ReceiveUTF8SplitAcrossMultipleBuffers()
        {
            // 1 character - 2 bytes
            byte[] payload = Encoding.UTF8.GetBytes("\u00E6");
            var    frame   = new byte[payload.Length + 2];

            frame[0] = 0x81; // FIN = true, Opcode = Text
            frame[1] = (byte)payload.Length;
            Array.Copy(payload, 0, frame, 2, payload.Length);

            using (var stream = new MemoryStream(frame, writable: true))
            {
                WebSocket websocket = WebSocketProtocol.CreateFromStream(stream, false, "null", Timeout.InfiniteTimeSpan);

                // read first half of the multi-byte character
                var recvBuffer = new byte[1];
                WebSocketReceiveResult result = await websocket.ReceiveAsync(new ArraySegment <byte>(recvBuffer), CancellationToken.None);

                Assert.False(result.EndOfMessage);
                Assert.Equal(1, result.Count);
                Assert.Equal(0xc3, recvBuffer[0]);

                // read second half of the multi-byte character
                result = await websocket.ReceiveAsync(new ArraySegment <byte>(recvBuffer), CancellationToken.None);

                Assert.True(result.EndOfMessage);
                Assert.Equal(1, result.Count);
                Assert.Equal(0xa6, recvBuffer[0]);
            }
        }
Exemple #4
0
        public void DisposeTest()
        {
            var wsProtocol = new WebSocketProtocol();

            wsProtocol.Port = 4884;
            wsProtocol.Listen();
            wsProtocol.Dispose();
            Assert.IsFalse(wsProtocol.Listening);
        }
        public override async Task ProcessRequestAsync()
        {
            DoUpgrade();

            await Connection.Transport.Output.FlushAsync();

            using (var ws = WebSocketProtocol.CreateFromStream(new DuplexStream(Connection.Transport), isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2), new byte[14]))
            {
                await ProcessAsync(ws);
            }
        }
Exemple #6
0
        public static WebSocketPair Create()
        {
            // Create streams
            var serverStream = new DuplexStream();
            var clientStream = serverStream.CreateReverseDuplexStream();

            return(new WebSocketPair(
                       serverStream,
                       clientStream,
                       clientSocket: WebSocketProtocol.CreateFromStream(clientStream, isServer: false, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2)),
                       serverSocket: WebSocketProtocol.CreateFromStream(serverStream, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2))));
        }
Exemple #7
0
 public void ConnectTest()
 {
     try
     {
         wsProtocol.Listen();
         WebSocketProtocol ipvClient = this.CreateWSClientProtocol();
         var socket = ipvClient.Connect(serverAddress, PORT);
         Assert.IsTrue(socket.Connected, "A connection could not be established.");
     }
     catch (Exception ex)
     {
         Assert.Fail(ex.ToString());
     }
 }
Exemple #8
0
        public async Task ConnectAsyncTaskTest()
        {
            try
            {
                wsProtocol.Listen();
                WebSocketProtocol ipvClient = this.CreateWSClientProtocol();
                var wsSocket = await ipvClient.ConnectAsync(serverAddress, PORT);

                Assert.IsNotNull(wsSocket);
                Assert.IsTrue(wsSocket.Connected);
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.ToString());
            }
        }
Exemple #9
0
        public void CreateFromStream_InvalidArguments_Throws()
        {
            AssertExtensions.Throws <ArgumentNullException>("stream",
                                                            () => WebSocketProtocol.CreateFromStream(null, true, "subProtocol", TimeSpan.FromSeconds(30), default(Memory <byte>)));
            AssertExtensions.Throws <ArgumentException>("stream",
                                                        () => WebSocketProtocol.CreateFromStream(new MemoryStream(new byte[100], writable: false), true, "subProtocol", TimeSpan.FromSeconds(30), default(Memory <byte>)));
            AssertExtensions.Throws <ArgumentException>("stream",
                                                        () => WebSocketProtocol.CreateFromStream(new UnreadableStream(), true, "subProtocol", TimeSpan.FromSeconds(30), default(Memory <byte>)));

            AssertExtensions.Throws <ArgumentException>("subProtocol",
                                                        () => WebSocketProtocol.CreateFromStream(new MemoryStream(), true, "    ", TimeSpan.FromSeconds(30), default(Memory <byte>)));
            AssertExtensions.Throws <ArgumentException>("subProtocol",
                                                        () => WebSocketProtocol.CreateFromStream(new MemoryStream(), true, "\xFF", TimeSpan.FromSeconds(30), default(Memory <byte>)));

            AssertExtensions.Throws <ArgumentOutOfRangeException>("keepAliveInterval", () =>
                                                                  WebSocketProtocol.CreateFromStream(new MemoryStream(), true, "subProtocol", TimeSpan.FromSeconds(-2), default(Memory <byte>)));
        }
            public async Task <WebSocket> AcceptAsync(WebSocketAcceptContext acceptContext)
            {
                if (!IsWebSocketRequest)
                {
                    throw new InvalidOperationException("Not a WebSocket request."); // TODO: LOC
                }

                string subProtocol = null;

                if (acceptContext != null)
                {
                    subProtocol = acceptContext.SubProtocol;
                }

                TimeSpan keepAliveInterval     = _options.KeepAliveInterval;
                int      receiveBufferSize     = _options.ReceiveBufferSize;
                var      advancedAcceptContext = acceptContext as ExtendedWebSocketAcceptContext;

                if (advancedAcceptContext != null)
                {
                    if (advancedAcceptContext.ReceiveBufferSize.HasValue)
                    {
                        receiveBufferSize = advancedAcceptContext.ReceiveBufferSize.Value;
                    }
                    if (advancedAcceptContext.KeepAliveInterval.HasValue)
                    {
                        keepAliveInterval = advancedAcceptContext.KeepAliveInterval.Value;
                    }
                }

                string key = string.Join(", ", _context.Request.Headers[Constants.Headers.SecWebSocketKey]);

                var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key, subProtocol);

                foreach (var headerPair in responseHeaders)
                {
                    _context.Response.Headers[headerPair.Key] = headerPair.Value;
                }

                Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101

                // Allocate a buffer for receive (default is 4k)
                var buffer = new byte[receiveBufferSize];

                return(WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: subProtocol, keepAliveInterval: keepAliveInterval, buffer: buffer));
            }
Exemple #11
0
        public void OnConnectionRequestedTest()
        {
            ManualResetEventSlim mevent = new ManualResetEventSlim(false);

            wsProtocol.Listen();
            mevent.Reset();
            bool eventInvoked = false;

            wsProtocol.OnConnectionRequested += (socket) =>
            {
                eventInvoked = true;
                mevent.Set();
            };
            WebSocketProtocol ipvClient = this.CreateWSClientProtocol();
            var clientSocket            = ipvClient.Connect(serverAddress, PORT);

            mevent.Wait(10000);
            Assert.IsTrue(eventInvoked);
        }
        protected override void OnReciveTextPacket(WebSocketProtocol aSender, IWebSocketPacket e)
        {
            if (recivePacket != null)
            {
                recivePacket(aSender, e);
            }
            try
            {
                JsonObject lTextjson = new JsonObject(e.GetString());

                IToken lToken = PacketToToken(e);
                string lType  = lToken.GetType();

                lock (PendingResponseQueue)
                {
                    if (!lType.Equals(WebSocketMessage.WELCOME) && !lType.Equals(WebSocketMessage.GOODBYTE))
                    {
                        try
                        {
                            int lUTID = lToken.GetInt(WebSocketMessage.UTID);
                            int lCode = lToken.GetInt(WebSocketMessage.CODE);

                            PendingResponseQueue lPRQI = PendingResponseQueue[lUTID];
                            if (lPRQI != null)
                            {
                                bool lSuccess = false;
                                if (lCode == 0)
                                {
                                    lSuccess = true;
                                }

                                TokenResponse lResponse = new TokenResponse(mPendingResponseQueue[lUTID].Token, lToken, lSuccess);
                                lPRQI.PendingResponse.Invoke(this, lResponse);
                                PendingResponseQueue.Remove(lUTID);
                            }
                        }
                        catch (Exception) { }
                    }
                }
                OnReciveTokenText(lToken);
            }
            catch (Exception) { }
        }
        public void Initialize()
        {
            ManualResetEvent mevent = new ManualResetEvent(false);

            ipv4Server = new WebSocketProtocol()
            {
                Port = PORT, Address = hostAddress
            };
            ipv4Server.Port = PORT;
            ipv4Server.OnConnectionRequested += (socket) =>
            {
                ipv4ServerClient = socket;
                mevent.Set();
            };
            ipv4Server.Listen();
            mevent.Reset();

            ipv4Client = this.CreateWSClientProtocol().Connect(serverAddress, PORT);
            mevent.WaitOne(1000);
        }
        private static async Task <WebSocket> Upgrade(HttpContext context)
        {
            var upgradeFeature = context.Features.Get <IHttpUpgradeFeature>();

            // Generate WebSocket response headers
            string key             = context.Request.Headers[Constants.Headers.SecWebSocketKey].ToString();
            var    responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key);

            foreach (var headerPair in responseHeaders)
            {
                context.Response.Headers[headerPair.Key] = headerPair.Value;
            }

            // Upgrade the connection
            Stream opaqueTransport = await upgradeFeature.UpgradeAsync();

            // Get the WebSocket object
            var ws = WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2));

            return(ws);
        }
Exemple #15
0
        public void ConnectAsyncCallbackTest()
        {
            ManualResetEventSlim mevent = new ManualResetEventSlim(false);

            mevent.Reset();
            try
            {
                wsProtocol.Listen();
                WebSocketProtocol ipvClient = this.CreateWSClientProtocol();
                bool connected = false;
                ipvClient.ConnectAsync((socket) =>
                {
                    connected = socket.Connected;
                    mevent.Set();
                }, serverAddress, PORT);
                mevent.Wait(1000);
                Assert.IsTrue(condition: connected, message: "A connection could not be established.");
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.ToString());
            }
        }
        public async Task WebSocketProtocol_CreateFromConnectedStream_Succeeds(Uri echoUri)
        {
            Uri uri = new UriBuilder(echoUri)
            {
                Scheme = (echoUri.Scheme == "ws") ? "http" : "https"
            }.Uri;
            HttpRequestMessage            request = new HttpRequestMessage(HttpMethod.Get, uri);
            KeyValuePair <string, string> secKeyAndSecWebSocketAccept = CreateSecKeyAndSecWebSocketAccept();

            AddWebSocketHeaders(request, secKeyAndSecWebSocketAccept.Key);
            DirectManagedHttpClientHandler handler = DirectManagedHttpClientHandler.CreateHandler();

            using (HttpResponseMessage response = await handler.SendAsync(request, CancellationToken.None).ConfigureAwait(false))
            {
                Assert.Equal(HttpStatusCode.SwitchingProtocols, response.StatusCode);
                using (Stream connectedStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                {
                    Assert.True(connectedStream.CanRead);
                    Assert.True(connectedStream.CanWrite);
                    using (WebSocket socket = WebSocketProtocol.CreateFromStream(connectedStream, false, null, TimeSpan.FromSeconds(10)))
                    {
                        Assert.NotNull(socket);
                        Assert.Equal(WebSocketState.Open, socket.State);

                        string expected            = "Hello World!";
                        ArraySegment <byte> buffer = new ArraySegment <byte>(Encoding.UTF8.GetBytes(expected));
                        await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

                        buffer = new ArraySegment <byte>(new byte[buffer.Count]);
                        await socket.ReceiveAsync(buffer, CancellationToken.None);

                        Assert.Equal(expected, Encoding.UTF8.GetString(buffer.Array));
                    }
                }
            }
        }
 protected override WebSocket CreateFromStream(Stream stream, bool isServer, string subProtocol, TimeSpan keepAliveInterval) =>
 WebSocketProtocol.CreateFromStream(stream, isServer, subProtocol, keepAliveInterval);
Exemple #18
0
        public async Task WebSocketProtocol_CreateFromConnectedStream_Succeeds(Uri echoUri)
        {
            using (var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
            {
                bool secure = echoUri.Scheme == "wss";
                client.Connect(echoUri.Host, secure ? 443 : 80);

                Stream stream = new NetworkStream(client, ownsSocket: false);
                if (secure)
                {
                    SslStream ssl = new SslStream(stream, leaveInnerStreamOpen: true, delegate { return(true); });
                    await ssl.AuthenticateAsClientAsync(echoUri.Host);

                    stream = ssl;
                }

                using (stream)
                {
                    using (var writer = new StreamWriter(stream, Encoding.ASCII, bufferSize: 1, leaveOpen: true))
                    {
                        await writer.WriteAsync($"GET {echoUri.PathAndQuery} HTTP/1.1\r\n");

                        await writer.WriteAsync($"Host: {echoUri.Host}\r\n");

                        await writer.WriteAsync($"Upgrade: websocket\r\n");

                        await writer.WriteAsync($"Connection: Upgrade\r\n");

                        await writer.WriteAsync($"Sec-WebSocket-Version: 13\r\n");

                        await writer.WriteAsync($"Sec-WebSocket-Key: {Convert.ToBase64String(Guid.NewGuid().ToByteArray())}\r\n");

                        await writer.WriteAsync($"\r\n");
                    }

                    using (var reader = new StreamReader(stream, Encoding.ASCII, detectEncodingFromByteOrderMarks: false, bufferSize: 1, leaveOpen: true))
                    {
                        string statusLine = await reader.ReadLineAsync();

                        Assert.NotEmpty(statusLine);
                        Assert.Equal("HTTP/1.1 101 Switching Protocols", statusLine);
                        while (!string.IsNullOrEmpty(await reader.ReadLineAsync()))
                        {
                            ;
                        }
                    }

                    using (WebSocket socket = WebSocketProtocol.CreateFromStream(stream, false, null, TimeSpan.FromSeconds(10)))
                    {
                        Assert.NotNull(socket);
                        Assert.Equal(WebSocketState.Open, socket.State);

                        string expected            = "Hello World!";
                        ArraySegment <byte> buffer = new ArraySegment <byte>(Encoding.UTF8.GetBytes(expected));
                        await socket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

                        buffer = new ArraySegment <byte>(new byte[buffer.Count]);
                        await socket.ReceiveAsync(buffer, CancellationToken.None);

                        Assert.Equal(expected, Encoding.UTF8.GetString(buffer.Array));
                    }
                }
            }
        }
Exemple #19
0
 public void CreateFromStream_ValidBufferSizes_Succeed(int bufferSize)
 {
     Assert.NotNull(WebSocketProtocol.CreateFromStream(new MemoryStream(), false, null, Timeout.InfiniteTimeSpan, new Memory <byte>(new byte[bufferSize])));
     Assert.NotNull(WebSocketProtocol.CreateFromStream(new MemoryStream(), true, null, Timeout.InfiniteTimeSpan, new Memory <byte>(new byte[bufferSize])));
 }
Exemple #20
0
        public override BaseProtocol SpawnProtocol(ulong type, Variant parameters)
        {
            BaseProtocol pResult = null;

            switch (type)
            {
            case ProtocolTypes.PT_TCP:
                pResult = new TCPProtocol();
                break;

            case ProtocolTypes.PT_UDP:
                pResult = new UDPProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_SSL:
                pResult = new InboundSSLProtocol();
                break;

            case ProtocolTypes.PT_OUTBOUND_SSL:
                pResult = new OutboundSSLProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_RTMP:
                pResult = new InboundRTMPProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_RTMPS_DISC:
                break;

            case ProtocolTypes.PT_OUTBOUND_RTMP:
                pResult = new OutboundRTMPProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_RTMFP:
                pResult = new InboundRTMFPProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_CLUSTER:
                pResult = new InboundClusterProtocol();
                break;

            case ProtocolTypes.PT_OUTBOUND_CLUSTER:
                pResult = new OutboundClusterProtocol();
                break;

            case ProtocolTypes.PT_RTSP:
                pResult = new RtspProtocol();
                break;

            case ProtocolTypes.PT_RTP_NAT_TRAVERSAL:
                pResult = new NATTraversalProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_RTP:
                pResult = new InboundRtpProtocol();
                break;

            case ProtocolTypes.PT_RTCP:
                pResult = new RtcpProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_WEBSOCKET:
                pResult = new WebSocketProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_WEBRTC_SIGNAL:
                pResult = new WebRtcSignalProtocol();
                break;

            case ProtocolTypes.PT_INBOUND_MP4:
                pResult = new Mp4Protocol();
                break;

            default:
                Logger.FATAL("Spawning protocol {0} not yet implemented",
                             type.TagToString());
                break;
            }
            if (pResult != null)
            {
                if (!pResult.Initialize(parameters))
                {
                    Logger.FATAL("Unable to initialize protocol {0}",
                                 type.TagToString());

                    pResult = null;
                }
            }
            return(pResult);
        }