Beispiel #1
0
 public void Flush()
 {
     if (_socket != null)
     {
         _socket.Flush();
     }
 }
Beispiel #2
0
        /// <summary>
        /// Handle a HTTP Upgrade request.
        /// </summary>
        /// <param name="req"></param>
        /// <param name="conn"></param>
        public void HandleUpgrade(HttpServerRequest req, TcpSocket socket, ArraySegment <byte> head)
        {
            if (!socket.Readable || !socket.Writable)
            {
                socket.Destroy();
                return;
            }

            if (OnConnection == null)
            {
                AbortConnection(socket, 400);
                return;
            }

            var upgrade = req.Headers["upgrade"];
            var version = req.Headers["sec-websocket-version"];

            if ((version != "13" && version != "8") ||
                !string.Equals(upgrade, "websocket", StringComparison.InvariantCultureIgnoreCase))
            {
                socket.Write(Encoding.ASCII.GetBytes(
                                 "HTTP/1.1 400 Bad Request\r\n" +
                                 "Connection: close\r\n" +
                                 "Sec-WebSocket-Version: 13, 8\r\n"));
                socket.Close();
                return;
            }

            string acceptKey;

            using (var sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider()) {
                var key = req.Headers["sec-websocket-key"];
                acceptKey = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(key + GUID)));
            }

            socket.Write(Encoding.UTF8.GetBytes(
                             "HTTP/1.1 101 Switching Protocols\r\n" +
                             "Upgrade: websocket\r\n" +
                             "Connection: Upgrade\r\n" +
                             "Sec-WebSocket-Accept: " + acceptKey + "\r\n\r\n"));
            socket.Flush();

            OnConnection.Invoke(new WebSocket(socket, req, head));
        }
Beispiel #3
0
        private void SendFrame(byte opcode, bool mask, bool fin, BufferData buff)
        {
            int payloadlen = buff != null ? buff.ByteLength : 0;
            int bufflen    = payloadlen;
            int headerlen  = 2;

            if (payloadlen >= 65535)
            {
                headerlen += 8;
                payloadlen = 127;
            }
            else if (payloadlen > 125)
            {
                headerlen += 2;
                payloadlen = 126;
            }

            int maskpos = headerlen;

            if (mask)
            {
                headerlen += 4;
                headerlen += bufflen;
            }

            var header = new byte[headerlen];

            header[0] = (byte)((fin ? 0x80 : 0) | (opcode & 0x0f));
            header[1] = (byte)((mask ? 0x80 : 0) | (payloadlen));
            if (payloadlen == 126)
            {
                var len = bufflen;
                header[2] = (byte)(len >> 8);
                header[3] = (byte)(len >> 0);
            }
            else if (payloadlen == 127)
            {
                var len = bufflen;
                header[2] = (byte)(len >> 24);
                header[3] = (byte)(len >> 16);
                header[4] = (byte)(len >> 8);
                header[5] = (byte)(len >> 0);
            }

            if (mask)
            {
                var r = _rand;
                _rand = _rand * 1103515245 + 12345;
                r     = 0;
                header[maskpos + 0] = (byte)(r >> 24);
                header[maskpos + 1] = (byte)(r >> 16);
                header[maskpos + 2] = (byte)(r >> 8);
                header[maskpos + 3] = (byte)(r >> 0);

                int p      = maskpos + 4;
                int maskid = 3;
                if (buff != null)
                {
                    foreach (var d in buff)
                    {
                        var buf = d.Array;
                        for (int i = d.Offset; i < d.Offset + d.Count; i++)
                        {
                            header[p] = (byte)(buf[i] ^ (byte)(r >> (maskid * 8)));
                            maskid    = ((maskid - 1) & 3);
                            p++;
                        }
                    }
                }
                _socket.Write(header);
            }
            else
            {
                _socket.Write(header);
                _socket.Write(buff);
            }
            _socket.Flush();
        }
Beispiel #4
0
 public void Flush()
 {
     _socket.Flush();
 }