Ejemplo n.º 1
0
        public async Task SendAsync(byte[] data, WebsockOpCode opcode = WebsockOpCode.Text)
        {
            WebsockFrame frame = new WebsockFrame();

            frame.Fin    = true;
            frame.Data   = data;
            frame.Masked = true;
            frame.Opcode = opcode;
            byte[] frameData = frame.Dump();
            await stream.WriteAsync(frameData, frameData.Length);
        }
Ejemplo n.º 2
0
        // Deny client with http error message
        private async Task <bool> RejectClient(ConnectionStream stream, string errorMessage)
        {
            byte[] errorData = Encoding.UTF8.GetBytes(HttpErrorTemplate
                                                      .Replace("{Content}", errorMessage)
                                                      .Replace("{ContentType}", "text/plain")
                                                      .Replace("{ContentLength}", errorMessage.Length.ToString()));
            await stream.WriteAsync(errorData, errorData.Length);

            stream.Dispose();
            return(false);
        }
Ejemplo n.º 3
0
        private async Task <bool> Handshake(ConnectionStream stream, Uri uri, int port)
        {
            state = WebsockState.Connecting;
            string handshakeData = HttpHandshakeData
                                   .Replace("{Path}", uri.PathAndQuery)
                                   .Replace("{Host}", uri.Host)
                                   .Replace("{Scheme}", uri.Scheme)
                                   .Replace("{Port}", port.ToString())
                                   .Replace("{Key}", GenerateKey());
            await stream.WriteAsync(handshakeData);

            string response = Encoding.UTF8.GetString(await stream.ReadAsync());

            return(response.Split('\n')[0].Split(' ')[1] == "101");
        }
Ejemplo n.º 4
0
        // Perform websocket handshake with client
        private async Task <bool> HandshakeClient(ConnectionStream stream)
        {
            // read and parse http request data
            byte[] httpData = await stream.ReadAsync();

            HttpPacket packet = new HttpPacket(httpData);

            // client requests checks
            if (!packet.Method.ToLower().StartsWith("get"))
            {
                return(await RejectClient(stream, "Only allows GET Requests"));
            }
            if (!packet.Headers.ContainsKey("Sec-WebSocket-Key"))
            {
                return(await RejectClient(stream, "No WebSocket-Key found"));
            }
            if (!packet.Headers.ContainsKey("Upgrade"))
            {
                return(await RejectClient(stream, "Upgrade header not set"));
            }
            else if (!packet.Headers["Upgrade"].ToLower().StartsWith("websocket"))
            {
                return(await RejectClient(stream, "Upgrade header not websocket"));
            }
            if (!packet.Headers.ContainsKey("Connection"))
            {
                return(await RejectClient(stream, "Connection header not set"));
            }
            else if (!packet.Headers["Connection"].ToLower().StartsWith("upgrade"))
            {
                return(await RejectClient(stream, "Connection header not upgrade"));
            }

            // generate websocket key, send response to client and complete handshake
            httpData = Encoding.UTF8.GetBytes(HttpHandshakeSucces.Replace(
                                                  "{WebsockKey}", GenerateKey(packet.Headers["Sec-WebSocket-Key"])));
            await stream.WriteAsync(httpData, httpData.Length);

            return(true);
        }