/// <summary> /// Read response from server and forward to client /// </summary> /// <param name="objState"></param> private void DoTransferData(object objState) { StreamState streamState = objState as StreamState; NetworkStream readStream = streamState.ServerStream as NetworkStream; NetworkStream writeStream = streamState.ClientStream as NetworkStream; byte[] buffer = new byte[Default.SendBufferSize]; try { while (true) { int bytesRead = readStream.Read(buffer, 0, buffer.Length); ProxyOperation.Write(writeStream, buffer, 0, bytesRead); } } catch (IOException e) { if (e.InnerException is SocketException sErr) { if (sErr.ErrorCode == 10053 || sErr.ErrorCode == 10054) { return; } throw sErr; } throw e; } catch (ObjectDisposedException) { return; } }
protected override void Run() { StreamState streamState = new StreamState() { Buffer = new byte[m_client.SendBufferSize], ClientStream = m_client.GetStream(), ServerStream = null, }; Thread DoTransfer = new Thread(DoTransferData) { Name = "Transfer Data", IsBackground = true }; // Extract remote host endpoint TcpClient server = null; try { string DomainEndPoint = GetHostHeader(m_request); IPEndPoint RemoteEndPoint = GetRemoteHostEndPoint(DomainEndPoint); // Connect to remote host by received IPEndPoint server = new TcpClient(); server.Connect(RemoteEndPoint); streamState.ServerStream = server.GetStream(); DoTransfer.Start(streamState); } catch (ArgumentNullException) { ExitInstance(); return; } List <byte> ReceivedBytes = new List <byte>(Encoding.ASCII.GetBytes(m_request)); do { int ErrorCode = ProxyOperation.Write(server.GetStream(), ReceivedBytes.ToArray(), 0, ReceivedBytes.Count); if (ErrorCode < 0) { // An error has occurred => proceed to close thread Logging.Log(string.Format("SocketException occured with error code: {0}", ErrorCode), LoggingLevel.Error); server.Close(); m_client.Close(); } ReceivedBytes = ProxyOperation.ReadRequest(m_client.GetStream()); } while (ReceivedBytes.Count != 0); ExitInstance(); }
protected override void Run() { // Get host EndPoint string[] domain = GetDomain(m_request); IPEndPoint hostEndPoint = GetHostEndPoint(domain[0], domain[1]); if (hostEndPoint == null) { ExitInstance(); return; } // Connect to remote host and authenticate connection TcpClient server = new TcpClient(); server.Connect(hostEndPoint); // Accept tunneling byte[] AcceptConnection = Encoding.ASCII.GetBytes("HTTP/1.1 200 Established\r\n\r\n"); ProxyOperation.Write(m_client.GetStream(), AcceptConnection, 0, AcceptConnection.Length); StreamState streamState = new StreamState() { ClientStream = m_client.GetStream(), ServerStream = server.GetStream(), }; Thread DoTransfer = new Thread(DoTransferData) { Name = "HTTPS Transfer Data", IsBackground = true }; DoTransfer.Start(streamState); List <byte> ReceivedBytes; do { ReceivedBytes = ProxyOperation.ReadRequest(m_client.GetStream()); int errCode = ProxyOperation.Write(server.GetStream(), ReceivedBytes.ToArray(), 0, ReceivedBytes.Count); if (errCode < 0) { ReceivedBytes.Clear(); Logging.Log(string.Format("Socket Exception with error code: {0}", errCode), LoggingLevel.Error); } } while (ReceivedBytes.Count != 0); ExitInstance(); }