Commit 606fe644 authored by titanium007's avatar titanium007

Use Async for each session

Make this fully asynchronous. Fix request modification
parent c479518b
......@@ -33,8 +33,9 @@ namespace Titanium.Web.Proxy.Models
internal Stream ClientStream { get; set; }
internal Stream ServerResponseStream { get; set; }
internal Encoding Encoding { get; set; }
internal bool WasModified { get; set; }
internal System.Threading.ManualResetEvent FinishedRequestEvent { get; set; }
internal bool RequestWasModified { get; set; }
internal bool ResponseWasModified { get; set; }
internal string UpgradeProtocol { get; set; }
......@@ -64,11 +65,13 @@ namespace Titanium.Web.Proxy.Models
mw.Close();
RequestHtmlBody = Encoding.Default.GetString(mw.ToArray());
}
RequestWasModified = true;
return RequestHtmlBody;
}
public void SetRequestHtmlBody(string Body)
{
this.RequestHtmlBody = Body;
RequestWasModified = true;
}
public string GetResponseHtmlBody()
{
......@@ -97,7 +100,7 @@ namespace Titanium.Web.Proxy.Models
break;
}
ResponseHtmlBody = ResponseData;
WasModified = true;
ResponseWasModified = true;
}
return ResponseHtmlBody;
......@@ -153,7 +156,13 @@ namespace Titanium.Web.Proxy.Models
public System.Net.Sockets.TcpClient Client { get; set; }
public string tunnelHostName { get; set; }
public string securehost { get; set; }
}
}
\ No newline at end of file
......@@ -33,7 +33,7 @@ namespace Titanium.Web.Proxy
private static object certificateAccessLock = new object();
private static List<string> pinnedCertificateClients = new List<string>();
private static ManualResetEvent tcpClientConnected = new ManualResetEvent(false);
private static TcpListener listener;
private static Thread listenerThread;
......@@ -46,6 +46,8 @@ namespace Titanium.Web.Proxy
public static IPAddress ListeningIPInterface { get; set; }
public static string RootCertificateName { get; set; }
public static bool EnableSSL { get; set; }
public static bool SetAsSystemProxy { get; set; }
public static Int32 ListeningPort
{
......@@ -141,65 +143,24 @@ namespace Titanium.Web.Proxy
{
while (ShouldListen)
{
// Set the event to nonsignaled state.
tcpClientConnected.Reset();
listener.BeginAcceptTcpClient(new AsyncCallback(AcceptTcpClientCallback), listener);
// Wait until a connection is made and processed before
// continuing.
tcpClientConnected.WaitOne();
var client = listener.AcceptTcpClient();
Task.Factory.StartNew(() => HandleClient(client));
}
}
catch (ThreadInterruptedException) { }
catch (SocketException ex)
catch (SocketException)
{
Debug.WriteLine(ex.Message);
}
}
public static void AcceptTcpClientCallback(IAsyncResult ar)
{
try
{
// Get the listener that handles the client request.
TcpListener listener = (TcpListener)ar.AsyncState;
TcpClient client = null;
// End the operation and display the received data on
// the console.
client = listener.EndAcceptTcpClient(ar);
Task.Factory.StartNew(() => ProcessClient(client));
// Signal the calling thread to continue.
tcpClientConnected.Set();
}
catch(ObjectDisposedException) { }
}
private static void ProcessClient(Object param)
{
try
{
TcpClient client = param as TcpClient;
HandleClientRequest(client);
client.Close();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
public static bool EnableSSL { get; set; }
public static bool SetAsSystemProxy { get; set; }
}
}
\ No newline at end of file
This diff is collapsed.
......@@ -11,12 +11,13 @@ using System.Security.Authentication;
using System.Diagnostics;
using Titanium.Web.Proxy.Models;
using Titanium.Web.Proxy.Helpers;
using System.Threading.Tasks;
namespace Titanium.Web.Proxy
{
partial class ProxyServer
{
private static void HandleServerResponse(IAsyncResult AsynchronousResult)
private static void HandleHttpSessionResponse(IAsyncResult AsynchronousResult)
{
SessionEventArgs args = (SessionEventArgs)AsynchronousResult.AsyncState;
......@@ -55,7 +56,7 @@ namespace Titanium.Web.Proxy
if (BeforeResponse != null)
BeforeResponse(null, args);
if (args.WasModified)
if (args.ResponseWasModified)
{
byte[] data;
......@@ -137,21 +138,36 @@ namespace Titanium.Web.Proxy
finally
{
if (args.ProxyRequest.KeepAlive == false)
{
if (responseWriter != null)
responseWriter.Close();
if (clientWriteStream != null)
clientWriteStream.Close();
}
if (args.ProxyRequest != null) args.ProxyRequest.Abort();
if (args.ServerResponseStream != null) args.ServerResponseStream.Close();
if (args.ServerResponse != null)
args.ServerResponse.Close();
args.FinishedRequestEvent.Set();
}
if (args.ProxyRequest.KeepAlive == false)
{
if (responseWriter != null)
responseWriter.Close();
if (clientWriteStream != null)
clientWriteStream.Close();
args.Client.Close();
}
else
{
string httpCmd, tmpLine;
List<string> requestLines = new List<string>();
requestLines.Clear();
while (!String.IsNullOrEmpty(tmpLine = args.ClientStreamReader.ReadLine()))
{
requestLines.Add(tmpLine);
}
httpCmd = requestLines.Count() > 0 ? requestLines[0] : null;
TcpClient Client = args.Client;
HandleHttpSessionRequest(Client, httpCmd, args.ProxyRequest.ConnectionGroupName, args.ClientStream, args.tunnelHostName, requestLines, args.ClientStreamReader, args.securehost);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment