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