/// <summary>
        /// Creates a <see cref="WebSocketConnectionInfo"/> for a given request and IP address.
        /// </summary>
        /// <param name="request">The <see cref="WebSocketHttpRequest"/> to get the connection information for.</param>
        /// <param name="clientIPAddress">The IP address of the client connection.</param>
        /// <returns>The created <see cref="WebSocketConnectionInfo"/>.</returns>
        public static WebSocketConnectionInfo Create(WebSocketHttpRequest request, string clientIPAddress)
        {
            if (request == null)
            {
                throw new ArgumentNullException("request", "Request to create WebSocket must not be null");
            }

            var info = new WebSocketConnectionInfo
            {
                Origin          = request["Origin"] ?? request["Sec-WebSocket-Origin"],
                Host            = request["Host"],
                SubProtocol     = request["Sec-WebSocket-Protocol"],
                Path            = request.Path,
                ClientIPAddress = clientIPAddress
            };

            var cookieHeader = request["Cookie"];

            if (cookieHeader != null)
            {
                var match  = CookieRegex.Match(cookieHeader);
                var fields = match.Groups["cookie_name"].Captures;
                var values = match.Groups["cookie_value"].Captures;
                for (var i = 0; i < fields.Count; i++)
                {
                    var name  = fields[i].ToString();
                    var value = values[i].ToString();
                    info.Cookies[name] = value;
                }
            }

            return(info);
        }
        /// <summary>
        /// Creates a <see cref="WebSocketConnectionInfo"/> for a given request and IP address.
        /// </summary>
        /// <param name="request">The <see cref="WebSocketHttpRequest"/> to get the connection information for.</param>
        /// <param name="clientIPAddress">The IP address of the client connection.</param>
        /// <returns>The created <see cref="WebSocketConnectionInfo"/>.</returns>
        public static WebSocketConnectionInfo Create(WebSocketHttpRequest request, string clientIPAddress)
        {
            var info = new WebSocketConnectionInfo
            {
                Origin = request["Origin"] ?? request["Sec-WebSocket-Origin"],
                Host = request["Host"],
                SubProtocol = request["Sec-WebSocket-Protocol"],
                Path = request.Path,
                ClientIPAddress = clientIPAddress
            };

            var cookieHeader = request["Cookie"];

            if (cookieHeader != null)
            {
                var match = CookieRegex.Match(cookieHeader);
                var fields = match.Groups["cookie_name"].Captures;
                var values = match.Groups["cookie_value"].Captures;
                for (var i = 0; i < fields.Count; i++)
                {
                    var name = fields[i].ToString();
                    var value = values[i].ToString();
                    info.Cookies[name] = value;
                }
            }

            return info;
        }
        private void CreateHandler(IEnumerable <byte> dataToParse)
        {
            var request = this.parser.Parse(dataToParse.ToArray(), this.scheme);

            if (request == null)
            {
                return;
            }

            try
            {
                this.Handler = HandlerFactory.BuildHandler(request);
            }
            catch (WebSocketException)
            {
                StandardHttpRequestReceivedEventArgs e = new StandardHttpRequestReceivedEventArgs(this);
                this.OnStandardHttpRequestReceived(e);
                if (!e.Handled)
                {
                    throw;
                }
            }

            if (this.Handler == null)
            {
                return;
            }

            this.Handler.TextMessageHandled   += new EventHandler <TextMessageHandledEventArgs>(this.Handler_TextMessageHandled);
            this.Handler.BinaryMessageHandled += new EventHandler <BinaryMessageHandledEventArgs>(this.Handler_BinaryMessageHandled);
            this.Handler.CloseHandled         += new EventHandler(this.Handler_CloseHandled);
            this.ConnectionInfo = WebSocketConnectionInfo.Create(request, this.Socket.RemoteIPAddress);

            var handshake = this.Handler.CreateHandshake();

            this.SendBytes(handshake);
            this.OnOpen(new ConnectionEventArgs(this));
        }