public HandshakeData Parse(ref byte[] data) { HandshakeData info = new HandshakeData(); try { string dataString = Encoding.UTF8.GetString(data); StringBuilder response = new StringBuilder("HTTP/1.1 101 Switching Protocols\r\n"); info.Add("Host", WSHandhsakeVersions.GetValue(ref dataString, "Host")); info.Add("User-Agent", WSHandhsakeVersions.GetValue(ref dataString, "User-Agent")); info.Add("Sec-WebSocket-Origin", WSHandhsakeVersions.GetValue(ref dataString, "Sec-WebSocket-Origin")); string upgrade = WSHandhsakeVersions.GetValue(ref dataString, "Upgrade"); response.Append("Upgrade: "); response.Append("websocket" /*upgrade*/); response.Append("\r\n"); info.Add("Upgrade", "websocket" /*upgrade*/); string connection = WSHandhsakeVersions.GetValue(ref dataString, "Connection"); response.Append("Connection: Upgrade"); response.Append("\r\n"); info.Add("Connection", connection); string key = WSHandhsakeVersions.GetValue(ref dataString, "Sec-WebSocket-Key"); response.Append("Sec-WebSocket-Accept: "); response.Append(this.AcceptKey(ref key)); response.Append("\r\n"); info.Add("Sec-WebSocket-Key", key); response.Append("\r\n"); info.Response = response.ToString(); } catch (Exception ex) { Log.Add("websocket handshake version 8 Parse exception: " + ex.ToString()); } return(info); }
public HandshakeData Parse(ref byte[] data) { HandshakeData info = new HandshakeData(); try { string dataString = Encoding.UTF8.GetString(data); StringBuilder response = new StringBuilder("HTTP/1.1 101 Switching Protocols\r\n"); string upgrade = WSHandhsakeVersions.GetValue(ref dataString, "Upgrade"); response.Append("Upgrade: "); response.Append(upgrade); response.Append("\r\n"); info.Add("Upgrade", upgrade); string connection = WSHandhsakeVersions.GetValue(ref dataString, "Connection"); response.Append("Connection: Upgrade"); response.Append("\r\n"); info.Add("Connection", connection); string origin = WSHandhsakeVersions.GetValue(ref dataString, "Origin"); info.Add("Origin", origin); response.Append("Sec-WebSocket-Origin: "); response.Append(origin); response.Append("\r\n"); info.Add("Host", WSHandhsakeVersions.GetValue(ref dataString, "Host")); response.Append("Sec-WebSocket-Location: "); response.Append("ws://86.171.240.1:8080/"); response.Append("\r\n"); string key1 = WSHandhsakeVersions.GetKeyValue(ref dataString, "Sec-WebSocket-Key1"); string key2 = WSHandhsakeVersions.GetKeyValue(ref dataString, "Sec-WebSocket-Key2"); if (!string.IsNullOrEmpty(key1) && !string.IsNullOrEmpty(key2)) { string key1Numbers = Regex.Replace(key1, @"[^\d]", "", RegexOptions.Singleline); string key2Numbers = Regex.Replace(key2, @"[^\d]", "", RegexOptions.Singleline); long key1Number, key2Number; if (long.TryParse(key1Numbers, out key1Number)) { if (long.TryParse(key2Numbers, out key2Number)) { int devide1 = Regex.Matches(key1, @"\s", RegexOptions.Singleline).Count; int devide2 = Regex.Matches(key2, @"\s", RegexOptions.Singleline).Count; key1Number = key1Number / devide1; key2Number = key2Number / devide2; MD5 md5 = MD5CryptoServiceProvider.Create(); byte[] key1Bytes = BitConverter.GetBytes((int)key1Number); byte[] key2Bytes = BitConverter.GetBytes((int)key2Number); if (BitConverter.IsLittleEndian) { Array.Reverse(key1Bytes); Array.Reverse(key2Bytes); } byte[] rest = data.Skip(data.Length - 8).ToArray(); byte[] resp = key1Bytes.Concat(key2Bytes).Concat(rest).ToArray(); byte[] hashBytes = md5.ComputeHash(resp); response.Append(Encoding.ASCII.GetString(hashBytes)); } } } info.Response = response.ToString(); } catch (Exception ex) { Log.Add("websocket handshake version 8 Parse exception: " + ex.ToString()); } return(info); }