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); };
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); }