Esempio n. 1
0
            /// <summary>
            /// Handles the WebSocket handshake.
            /// </summary>
            /// <param name="channel"></param>
            /// <param name="request"></param>
            private void HandleHandshake(ISockNetChannel channel, ref HttpRequest request)
            {
                string connection  = request.Header["Connection"];
                string upgrade     = request.Header["Upgrade"];
                string securityKey = request.Header[WebSocketUtil.WebSocketKeyHeader];

                if (connection != null && upgrade != null && securityKey != null && "websocket".Equals(upgrade.Trim().ToLower()) && "upgrade".Equals(connection.Trim().ToLower()))
                {
                    string[] requestProtocols = request.Headers[WebSocketUtil.WebSocketProtocolHeader];

                    List <string> handledProtocols = new List <string>();
                    if (requestProtocols != null && protocolDelegate != null)
                    {
                        for (int i = 0; i < requestProtocols.Length; i++)
                        {
                            if (protocolDelegate(channel, requestProtocols[i]))
                            {
                                handledProtocols.Add(requestProtocols[i]);
                            }
                        }
                    }

                    HttpResponse response = new HttpResponse(channel.BufferPool)
                    {
                        Version = "HTTP/1.1",
                        Code    = "101",
                        Reason  = "Switching Protocols"
                    };
                    response.Header["Upgrade"]    = "websocket";
                    response.Header["Connection"] = "Upgrade";
                    response.Header[WebSocketUtil.WebSocketAcceptHeader]   = WebSocketUtil.GenerateAccept(securityKey);
                    response.Header[WebSocketUtil.WebSocketProtocolHeader] = string.Join(",", handledProtocols.ToArray());

                    channel.Send(response);

                    channel.RemoveModule(httpModule);

                    channel.Pipe.AddIncomingFirst <object>(HandleIncomingFrames);
                    channel.Pipe.AddOutgoingLast <object>(HandleOutgoingFrames);
                }
                else
                {
                    SockNetLogger.Log(SockNetLogger.LogLevel.ERROR, this, "Expecting upgrade request.");

                    channel.Close();
                }
            }
            /// <summary>
            /// Invoked on channel connect.
            /// </summary>
            /// <param name="channel"></param>
            public void OnConnected(ISockNetChannel channel)
            {
                SockNetLogger.Log(SockNetLogger.LogLevel.INFO, this, "Sending WebSocket upgrade request.");

                channel.Pipe.AddIncomingLast <HttpResponse>(HandleHandshake);

                HttpRequest request = new HttpRequest(channel.BufferPool)
                {
                    Action  = "GET",
                    Path    = path,
                    Version = "HTTP/1.1"
                };

                request.Header["Host"]       = hostname;
                request.Header["Upgrade"]    = "websocket";
                request.Header["Connection"] = "Upgrade";
                request.Header[WebSocketUtil.WebSocketKeyHeader]     = secKey;
                request.Header[WebSocketUtil.WebSocketVersionHeader] = "13";

                channel.Send(request);
            }
            /// <summary>
            /// Invoked on channel connect.
            /// </summary>
            /// <param name="channel"></param>
            public void OnConnected(ISockNetChannel channel)
            {
                SockNetLogger.Log(SockNetLogger.LogLevel.INFO, this, "Sending WebSocket upgrade request.");

                channel.Pipe.AddIncomingLast<HttpResponse>(HandleHandshake);

                HttpRequest request = new HttpRequest(channel.BufferPool)
                {
                    Action = "GET",
                    Path = path,
                    Version = "HTTP/1.1"
                };
                request.Header["Host"] = hostname;
                request.Header["Upgrade"] = "websocket";
                request.Header["Connection"] = "Upgrade";
                request.Header[WebSocketUtil.WebSocketKeyHeader] = secKey;
                request.Header[WebSocketUtil.WebSocketVersionHeader] = "13";

                channel.Send(request);
            }
            /// <summary>
            /// Handles the WebSocket handshake.
            /// </summary>
            /// <param name="channel"></param>
            /// <param name="request"></param>
            private void HandleHandshake(ISockNetChannel channel, ref HttpRequest request)
            {
                string connection = request.Header["Connection"];
                string upgrade = request.Header["Upgrade"];
                string securityKey = request.Header[WebSocketUtil.WebSocketKeyHeader];

                if (connection != null && upgrade != null && securityKey != null && "websocket".Equals(upgrade.Trim().ToLower()) && "upgrade".Equals(connection.Trim().ToLower()))
                {
                    string[] requestProtocols = request.Headers[WebSocketUtil.WebSocketProtocolHeader];

                    List<string> handledProtocols = new List<string>();
                    if (requestProtocols != null && protocolDelegate != null)
                    {
                        for (int i = 0; i < requestProtocols.Length; i++)
                        {
                            if (protocolDelegate(channel, requestProtocols[i]))
                            {
                                handledProtocols.Add(requestProtocols[i]);
                            }
                        }
                    }

                    HttpResponse response = new HttpResponse(channel.BufferPool)
                    {
                        Version = "HTTP/1.1",
                        Code = "101",
                        Reason = "Switching Protocols"
                    };
                    response.Header["Upgrade"] = "websocket";
                    response.Header["Connection"] = "Upgrade";
                    response.Header[WebSocketUtil.WebSocketAcceptHeader] = WebSocketUtil.GenerateAccept(securityKey);
                    response.Header[WebSocketUtil.WebSocketProtocolHeader] = string.Join(",", handledProtocols.ToArray());

                    channel.Send(response);

                    channel.RemoveModule(httpModule);

                    channel.Pipe.AddIncomingFirst<object>(HandleIncomingFrames);
                    channel.Pipe.AddOutgoingLast<object>(HandleOutgoingFrames);
                }
                else
                {
                    SockNetLogger.Log(SockNetLogger.LogLevel.ERROR, this, "Expecting upgrade request.");

                    channel.Close();
                }
            }