Ejemplo n.º 1
0
        private void InternalHandleRequest(WebSocketClient client, HttpHeader header)
        {
            if (header.Method != HttpRequestMethod.Get)
            {
                client.Disconnect("Unexpected request method for websocket handshake: " + header.Method);
                return;
            }

            if (!AuthorizeRequest(client, header))
            {
                client.Disconnect("Client authorization failed.");
                return;
            }

            string upgrade           = "";
            string connection        = "";
            string webSocketKey      = "";
            string webSocketProtocol = null;
            int    webSocketVersion  = 1;

            header.GetParameter("Sec-WebSocket-Protocol", ref webSocketProtocol);
            header.GetParameter("Sec-WebSocket-Version", ref webSocketVersion);

            if (!header.GetParameter("Upgrade", ref upgrade) ||
                !header.GetParameter("Connection", ref connection) ||
                !header.GetParameter("Sec-WebSocket-Key", ref webSocketKey) ||
                string.Compare(upgrade, "websocket", true) != 0 ||
                string.Compare(connection, "upgrade", true) != 0)
            {
                client.SendErrorResponse(500, "Internal Error", "Invalid websocket request.");
                return;
            }

            var responseKey = GenerateWebSocketAcceptKey(webSocketKey);

            var response = new StringBuilder(256);

            response.AppendFormat(
                "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: {0}\r\n",
                responseKey);

            if (webSocketProtocol != null)
            {
                response.AppendFormat("Sec-WebSocket-Protocol: {0}\r\n", webSocketProtocol);
            }

            response.Append("\r\n");

            client.Send(DataBuffer.FromString(response.ToString()));
            client.Buffer.Reset();
            client.UpgradeToWebSocket();

            OnWebSocketOpen(client);
        }