Exemplo n.º 1
0
        /// <summary>
        /// Handles the handshake.
        /// </summary>
        private void HandleHandshake()
        {
            const int    WEB_SOCKET_VERSION        = 13;
            const string WEB_SOCKET_KEY_HEADER     = "Sec-WebSocket-Key";
            const string WEB_SOCKET_VERSION_HEADER = "Sec-WebSocket-Version";

            HttpMetadata = new HttpMetadata(_frameReader.Stream, _dependencyUtility);
            if (!HttpMetadata.IsValid)
            {
                return;
            }

            if (string.IsNullOrEmpty(HttpMetadata.Route) || HttpMetadata.Headers.Count == 0)
            {
                KillConnection("Failed to read from stream");
                return;
            }

            if (!HttpMetadata.Headers.ContainsKey(WEB_SOCKET_KEY_HEADER) ||
                !HttpMetadata.Headers.ContainsKey(WEB_SOCKET_VERSION_HEADER))
            {
                KillConnection("Failed to retrieve websocket headers");
                return;
            }

            int secWebSocketVersion = Convert.ToInt32(HttpMetadata.Headers[WEB_SOCKET_VERSION_HEADER]);

            if (secWebSocketVersion < WEB_SOCKET_VERSION)
            {
                KillConnection($"WebSocket Version {secWebSocketVersion} not supported. Must be {WEB_SOCKET_VERSION} or higher");
                return;
            }

            string secWebSocketKey    = HttpMetadata.Headers[WEB_SOCKET_KEY_HEADER];
            string secWebSocketAccept = ComputeSocketAcceptString(secWebSocketKey);
            string response           = ComputeResponseString(secWebSocketAccept);

            byte[] responseBytes = Encoding.UTF8.GetBytes(response);
            _frameReader.Stream.Write(responseBytes, 0, responseBytes.Length);

            IsValid = true;

            IWebSocketDataHandler handler = _routeTable[HttpMetadata.Route];

            handler?.OnOpen(this, new ConnectionOpenedEventArgs(HttpMetadata.QueryStrings));
        }
Exemplo n.º 2
0
 /// <summary>
 /// Adds one HTTP header and its value.
 /// </summary>
 /// <param name="key">header name</param>
 /// <param name="value">header value</param>
 public void AddHeader(string key, object value)
 {
     //_metadata.Add(key, value);
     HttpMetadata.Add(key, value);
 }