예제 #1
0
        public virtual TConnection Generate(Tcp.Connection connection, URL url, params string[] reqSubprotocols)
        {
            ClientConnection httpClient    = new ClientConnection(connection);
            OutgoingRequest  req           = httpClient.Enqueue("HTTP/1.1", "GET", url);
            TConnection      newConnection = GenerateConnection(connection, req.Head);

            string reqExtensions = NegotiatingExtension.Stringify(RequestExtensions());
            string key           = Secret.GenerateKey();

            req["Connection"]            = "Upgrade";
            req["Upgrade"]               = "websocket";
            req["Sec-WebSocket-Version"] = "13";
            req["Sec-WebSocket-Key"]     = key;
            if (reqSubprotocols.Length > 0)
            {
                req["Sec-WebSocket-Protocol"] = SubprotocolNegotiation.Stringify(reqSubprotocols);
            }
            if (reqExtensions.Length > 0)
            {
                req["Sec-WebSocket-Extensions"] = reqExtensions;
            }

            req.OnResponse += (res) =>
            {
                if (!VerifyResponseHead(res, key))
                {
                    httpClient.Terminate(); return;
                }
                string subprotocol = res["Sec-WebSocket-Protocol"];
                if (subprotocol != null)
                {
                    bool validSubprotocol = false;
                    for (int i = 0; i < reqSubprotocols.Length; i++)
                    {
                        if (reqSubprotocols[i] == subprotocol)
                        {
                            validSubprotocol = true; break;
                        }
                    }
                    if (!validSubprotocol)
                    {
                        httpClient.Terminate(); return;
                    }
                }
                newConnection.SetSubprotocol(subprotocol);
                if (
                    !NegotiatingExtension.TryParse(res["Sec-WebSocket-Extensions"] ?? "", out NegotiatingExtension[] resExtensions) ||
                    !CheckExtensions(resExtensions)
                    )
                {
                    httpClient.Terminate(); return;
                }

                byte[] trail = httpClient.Freeze();
                if (!httpClient.End())
                {
                    return;
                }
                newConnection.Initiate(trail);
            };
예제 #2
0
        protected virtual bool RequestHandler(IncomingRequest req, OutgoingResponse res)
        {
            if (!CheckHeaders(req, res))
            {
                return(false);
            }
            IPAddress remote = res.Connection.Base.RemoteAddress;

            if (!SubprotocolNegotiation.TryParse(req["Sec-WebSocket-Protocol"] ?? "", out string[] subprotocols))