Example #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);
            };
Example #2
0
        public static bool TryParse(string s, out NegotiatingExtension[] result)
        {
            result = null;
            if (s == "")
            {
                result = new NegotiatingExtension[0]; return(true);
            }
            List <NegotiatingExtension> parsed = new List <NegotiatingExtension>();

            string[] spl = s.Split(",");
            for (int i = 0; i < spl.Length; i++)
            {
                string ext = spl[i].Trim();
                if (ext.Length == 0)
                {
                    return(false);
                }
                string[]             spl2    = ext.Split(";");
                NegotiatingExtension current = new NegotiatingExtension();
                if ((current.ExtensionName = spl2[0].Trim()).Length == 0)
                {
                    return(false);
                }
                for (int j = 1; j < spl2.Length; j++)
                {
                    string[] spl3 = spl2[j].Split("=");
                    if (spl3.Length > 2)
                    {
                        return(false);
                    }
                    current.Parameters.Add(spl3[0].Trim(), spl3.Length == 2 ? spl3[1].Trim() : "");
                }
                parsed.Add(current);
            }
            result = parsed.ToArray();
            return(true);
        }