private void ReadBrowser(IAsyncResult ar) { try { RawSSLObj rso = (RawSSLObj)ar.AsyncState; if (rso.rawData.client == null || rso.rawData.bridge == null) { return; } int bytesRead = rso.rawData.client.EndReceive(ar); if (bytesRead > 0) { byte[] req = new byte[bytesRead]; Array.Copy(rso.rawData.data, req, bytesRead); rso.rawData.bridge.Send(req, 0, bytesRead, SocketFlags.None); Array.Clear(req, 0, bytesRead); } else { if (rso.rawData.client != null) { rso.rawData.client.Close(); rso.rawData.client.Dispose(); rso.rawData.client = null; } if (rso.rawData.bridge != null) { rso.rawData.bridge.Close(); rso.rawData.bridge.Dispose(); rso.rawData.bridge = null; } return; } //Console.WriteLine("Read success!"); rso.rawData.data = new byte[2048]; rso.rawData.client.BeginReceive(rso.rawData.data, 0, 2048, SocketFlags.None, new AsyncCallback(ReadBrowser), rso); } catch (Exception) { //console.Debug($"Failed to read raw http from browser: {ex.ToString()}"); } }
public void SendHTTPS(Socket browser) { //if (https == ProxyServer.Mode.MITM) return; try { Socket bridge = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = GetIPOfHost(_host); if (ip == null) { if (browser != null) { browser.Close(); browser.Dispose(); browser = null; } return; } //Console.WriteLine("Step 5"); bridge.Connect(ip, 443); RawSSLObj rso = new RawSSLObj() { fullText = "", request = null, rawData = new RawObj { data = new byte[2048], client = browser, bridge = bridge } }; RawObj ro = new RawObj() { data = new byte[2048], bridge = bridge, client = browser }; bridge.BeginReceive(ro.data, 0, 2048, SocketFlags.None, new AsyncCallback(ForwardRawHTTP), ro); browser.BeginReceive(rso.rawData.data, 0, 2048, SocketFlags.None, new AsyncCallback(ReadBrowser), rso); GenerateVerify(browser); } catch (SocketException socketError) { Console.WriteLine(socketError.ToString()); } }