private static void HandleHttpSessionRequest(TcpClient client, string httpCmd, Stream clientStream, CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, bool IsHttps) { TcpConnection connection = null; string lastRequestHostName = null; while (true) { if (string.IsNullOrEmpty(httpCmd)) { Dispose(client, clientStream, clientStreamReader, clientStreamWriter, null); break; } var args = new SessionEventArgs(); args.Client.TcpClient = client; try { //break up the line into three components (method, remote URL & Http Version) var httpCmdSplit = httpCmd.Split(SpaceSplit, 3); var httpMethod = httpCmdSplit[0]; var httpVersion = httpCmdSplit[2]; Version version; if (httpVersion == "HTTP/1.1") { version = new Version(1, 1); } else { version = new Version(1, 0); } args.ProxySession.Request.RequestHeaders = new List <HttpHeader>(); string tmpLine; while (!string.IsNullOrEmpty(tmpLine = clientStreamReader.ReadLine())) { var header = tmpLine.Split(new char[] { ':' }, 2); args.ProxySession.Request.RequestHeaders.Add(new HttpHeader(header[0], header[1])); } var httpRemoteUri = new Uri(!IsHttps ? httpCmdSplit[1] : (string.Concat("https://", args.ProxySession.Request.Host, httpCmdSplit[1]))); args.IsHttps = IsHttps; args.ProxySession.Request.RequestUri = httpRemoteUri; args.ProxySession.Request.Method = httpMethod; args.ProxySession.Request.HttpVersion = httpVersion; args.Client.ClientStream = clientStream; args.Client.ClientStreamReader = clientStreamReader; args.Client.ClientStreamWriter = clientStreamWriter; //If requested interception if (BeforeRequest != null) { BeforeRequest(null, args); } args.ProxySession.Request.RequestLocked = true; if (args.ProxySession.Request.CancelRequest) { Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); break; } if (args.ProxySession.Request.UpgradeToWebSocket) { TcpHelper.SendRaw(clientStream, httpCmd, args.ProxySession.Request.RequestHeaders, httpRemoteUri.Host, httpRemoteUri.Port, args.IsHttps); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); return; } PrepareRequestHeaders(args.ProxySession.Request.RequestHeaders, args.ProxySession); //construct the web request that we are going to issue on behalf of the client. connection = connection == null? TcpConnectionManager.GetClient(args.ProxySession.Request.RequestUri.Host, args.ProxySession.Request.RequestUri.Port, args.IsHttps) : lastRequestHostName != args.ProxySession.Request.RequestUri.Host ? TcpConnectionManager.GetClient(args.ProxySession.Request.RequestUri.Host, args.ProxySession.Request.RequestUri.Port, args.IsHttps) : connection; lastRequestHostName = args.ProxySession.Request.RequestUri.Host; args.ProxySession.Request.Host = args.ProxySession.Request.RequestUri.Host; args.ProxySession.SetConnection(connection); args.ProxySession.SendRequest(); //If request was modified by user if (args.ProxySession.Request.RequestBodyRead) { args.ProxySession.Request.ContentLength = args.ProxySession.Request.RequestBody.Length; var newStream = args.ProxySession.ProxyClient.ServerStreamReader.BaseStream; newStream.Write(args.ProxySession.Request.RequestBody, 0, args.ProxySession.Request.RequestBody.Length); } else { //If its a post/put request, then read the client html body and send it to server if (httpMethod.ToUpper() == "POST" || httpMethod.ToUpper() == "PUT") { SendClientRequestBody(args); } } HandleHttpSessionResponse(args); //if connection is closing exit if (args.ProxySession.Response.ResponseKeepAlive == false) { connection.TcpClient.Close(); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); return; } // read the next request httpCmd = clientStreamReader.ReadLine(); } catch { Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); break; } } if (connection != null) { TcpConnectionManager.ReleaseClient(connection); } }