Commit 2d85486e authored by justcoding121's avatar justcoding121 Committed by GitHub

Merge pull request #94 from justcoding121/master

Sync with master
parents a954c575 216b8c90
...@@ -56,7 +56,7 @@ Task Restore-Packages { ...@@ -56,7 +56,7 @@ Task Restore-Packages {
} }
Task Install-MSBuild { Task Install-MSBuild {
if(!(Test-Path "${env:ProgramFiles(x86)}\MSBuild\12.0\Bin\msbuild.exe")) if(!(Test-Path "${env:ProgramFiles(x86)}\MSBuild\14.0\Bin\msbuild.exe"))
{ {
cinst microsoft-build-tools -y cinst microsoft-build-tools -y
} }
......
...@@ -35,12 +35,12 @@ After installing nuget package mark following files to be copied to app director ...@@ -35,12 +35,12 @@ After installing nuget package mark following files to be copied to app director
Setup HTTP proxy: Setup HTTP proxy:
```csharp ```csharp
var ProxyServer = new ProxyServer(); var proxyServer = new ProxyServer();
ProxyServer.BeforeRequest += OnRequest; proxyServer.BeforeRequest += OnRequest;
ProxyServer.BeforeResponse += OnResponse; proxyServer.BeforeResponse += OnResponse;
ProxyServer.ServerCertificateValidationCallback += OnCertificateValidation; proxyServer.ServerCertificateValidationCallback += OnCertificateValidation;
ProxyServer.ClientCertificateSelectionCallback += OnCertificateSelection; proxyServer.ClientCertificateSelectionCallback += OnCertificateSelection;
//Exclude Https addresses you don't want to proxy //Exclude Https addresses you don't want to proxy
...@@ -53,8 +53,8 @@ Setup HTTP proxy: ...@@ -53,8 +53,8 @@ Setup HTTP proxy:
//An explicit endpoint is where the client knows about the existance of a proxy //An explicit endpoint is where the client knows about the existance of a proxy
//So client sends request in a proxy friendly manner //So client sends request in a proxy friendly manner
ProxyServer.AddEndPoint(explicitEndPoint); proxyServer.AddEndPoint(explicitEndPoint);
ProxyServer.Start(); proxyServer.Start();
//Transparent endpoint is usefull for reverse proxying (client is not aware of the existance of proxy) //Transparent endpoint is usefull for reverse proxying (client is not aware of the existance of proxy)
...@@ -67,26 +67,29 @@ Setup HTTP proxy: ...@@ -67,26 +67,29 @@ Setup HTTP proxy:
{ {
GenericCertificateName = "google.com" GenericCertificateName = "google.com"
}; };
ProxyServer.AddEndPoint(transparentEndPoint); proxyServer.AddEndPoint(transparentEndPoint);
//ProxyServer.UpStreamHttpProxy = new ExternalProxy() { HostName = "localhost", Port = 8888 }; //proxyServer.UpStreamHttpProxy = new ExternalProxy() { HostName = "localhost", Port = 8888 };
//ProxyServer.UpStreamHttpsProxy = new ExternalProxy() { HostName = "localhost", Port = 8888 }; //proxyServer.UpStreamHttpsProxy = new ExternalProxy() { HostName = "localhost", Port = 8888 };
foreach (var endPoint in ProxyServer.ProxyEndPoints) foreach (var endPoint in proxyServer.ProxyEndPoints)
Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ", Console.WriteLine("Listening on '{0}' endpoint at Ip {1} and port: {2} ",
endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port); endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);
//Only explicit proxies can be set as system proxy! //Only explicit proxies can be set as system proxy!
ProxyServer.SetAsSystemHttpProxy(explicitEndPoint); proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
ProxyServer.SetAsSystemHttpsProxy(explicitEndPoint); proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);
//wait here (You can use something else as a wait function, I am using this as a demo) //wait here (You can use something else as a wait function, I am using this as a demo)
Console.Read(); Console.Read();
//Unsubscribe & Quit //Unsubscribe & Quit
ProxyServer.BeforeRequest -= OnRequest; proxyServer.BeforeRequest -= OnRequest;
ProxyServer.BeforeResponse -= OnResponse; proxyServer.BeforeResponse -= OnResponse;
ProxyServer.Stop(); proxyServer.ServerCertificateValidationCallback -= OnCertificateValidation;
proxyServer.ClientCertificateSelectionCallback -= OnCertificateSelection;
proxyServer.Stop();
``` ```
Sample request and response event handlers Sample request and response event handlers
......
...@@ -62,8 +62,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -62,8 +62,7 @@ namespace Titanium.Web.Proxy.EventArguments
ProxyClient = new ProxyClient(); ProxyClient = new ProxyClient();
WebSession = new HttpWebClient(); WebSession = new HttpWebClient();
} }
/// <summary> /// <summary>
/// Read request body content as bytes[] for current session /// Read request body content as bytes[] for current session
/// </summary> /// </summary>
...@@ -98,7 +97,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -98,7 +97,7 @@ namespace Titanium.Web.Proxy.EventArguments
await this.ProxyClient.ClientStreamReader.CopyBytesToStream(bufferSize, requestBodyStream, WebSession.Request.ContentLength); await this.ProxyClient.ClientStreamReader.CopyBytesToStream(bufferSize, requestBodyStream, WebSession.Request.ContentLength);
} }
else if(WebSession.Request.HttpVersion.Major == 1 && WebSession.Request.HttpVersion.Minor == 0) else if (WebSession.Request.HttpVersion.Major == 1 && WebSession.Request.HttpVersion.Minor == 0)
await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, requestBodyStream, long.MaxValue); await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, requestBodyStream, long.MaxValue);
} }
WebSession.Request.RequestBody = await GetDecompressedResponseBody(WebSession.Request.ContentEncoding, requestBodyStream.ToArray()); WebSession.Request.RequestBody = await GetDecompressedResponseBody(WebSession.Request.ContentEncoding, requestBodyStream.ToArray());
...@@ -108,7 +107,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -108,7 +107,7 @@ namespace Titanium.Web.Proxy.EventArguments
//So that next time we can deliver body from cache //So that next time we can deliver body from cache
WebSession.Request.RequestBodyRead = true; WebSession.Request.RequestBodyRead = true;
} }
} }
/// <summary> /// <summary>
...@@ -134,7 +133,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -134,7 +133,7 @@ namespace Titanium.Web.Proxy.EventArguments
await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, responseBodyStream, WebSession.Response.ContentLength); await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, responseBodyStream, WebSession.Response.ContentLength);
} }
else if(WebSession.Response.HttpVersion.Major == 1 && WebSession.Response.HttpVersion.Minor == 0) else if (WebSession.Response.HttpVersion.Major == 1 && WebSession.Response.HttpVersion.Minor == 0)
await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, responseBodyStream, long.MaxValue); await WebSession.ServerConnection.StreamReader.CopyBytesToStream(bufferSize, responseBodyStream, long.MaxValue);
} }
...@@ -152,10 +151,13 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -152,10 +151,13 @@ namespace Titanium.Web.Proxy.EventArguments
/// <returns></returns> /// <returns></returns>
public async Task<byte[]> GetRequestBody() public async Task<byte[]> GetRequestBody()
{ {
if (WebSession.Request.RequestLocked) if (!WebSession.Request.RequestBodyRead)
throw new Exception("You cannot call this function after request is made to server."); {
if (WebSession.Request.RequestLocked)
throw new Exception("You cannot call this function after request is made to server.");
await ReadRequestBody(); await ReadRequestBody();
}
return WebSession.Request.RequestBody; return WebSession.Request.RequestBody;
} }
/// <summary> /// <summary>
...@@ -164,12 +166,13 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -164,12 +166,13 @@ namespace Titanium.Web.Proxy.EventArguments
/// <returns></returns> /// <returns></returns>
public async Task<string> GetRequestBodyAsString() public async Task<string> GetRequestBodyAsString()
{ {
if (WebSession.Request.RequestLocked) if (!WebSession.Request.RequestBodyRead)
throw new Exception("You cannot call this function after request is made to server."); {
if (WebSession.Request.RequestLocked)
throw new Exception("You cannot call this function after request is made to server.");
await ReadRequestBody();
await ReadRequestBody();
}
//Use the encoding specified in request to decode the byte[] data to string //Use the encoding specified in request to decode the byte[] data to string
return WebSession.Request.RequestBodyString ?? (WebSession.Request.RequestBodyString = WebSession.Request.Encoding.GetString(WebSession.Request.RequestBody)); return WebSession.Request.RequestBodyString ?? (WebSession.Request.RequestBodyString = WebSession.Request.Encoding.GetString(WebSession.Request.RequestBody));
} }
...@@ -285,7 +288,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -285,7 +288,7 @@ namespace Titanium.Web.Proxy.EventArguments
var bodyBytes = WebSession.Response.Encoding.GetBytes(body); var bodyBytes = WebSession.Response.Encoding.GetBytes(body);
await SetResponseBody(bodyBytes); await SetResponseBody(bodyBytes);
} }
private async Task<byte[]> GetDecompressedResponseBody(string encodingType, byte[] responseBodyStream) private async Task<byte[]> GetDecompressedResponseBody(string encodingType, byte[] responseBodyStream)
{ {
...@@ -345,7 +348,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -345,7 +348,7 @@ namespace Titanium.Web.Proxy.EventArguments
WebSession.Request.CancelRequest = true; WebSession.Request.CancelRequest = true;
} }
/// a generic responder method /// a generic responder method
public async Task Respond(Response response) public async Task Respond(Response response)
{ {
......
...@@ -115,8 +115,10 @@ namespace Titanium.Web.Proxy.Http ...@@ -115,8 +115,10 @@ namespace Titanium.Web.Proxy.Http
if (string.IsNullOrEmpty(httpResult[0])) if (string.IsNullOrEmpty(httpResult[0]))
{ {
await ServerConnection.StreamReader.ReadLineAsync(); //Empty content in first-line, try again
httpResult = (await ServerConnection.StreamReader.ReadLineAsync()).Split(ProxyConstants.SpaceSplit, 3);
} }
var httpVersion = httpResult[0].Trim().ToLower(); var httpVersion = httpResult[0].Trim().ToLower();
var version = new Version(1,1); var version = new Version(1,1);
......
...@@ -186,7 +186,7 @@ namespace Titanium.Web.Proxy ...@@ -186,7 +186,7 @@ namespace Titanium.Web.Proxy
#if !DEBUG #if !DEBUG
firefoxProxySettingsManager.AddFirefox(); firefoxProxySettingsManager.AddFirefox();
#endif #endif
Console.WriteLine("Set endpoint at Ip {1} and port: {2} as System HTTPS Proxy", endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port); Console.WriteLine("Set endpoint at Ip {1} and port: {2} as System HTTP Proxy", endPoint.GetType().Name, endPoint.IpAddress, endPoint.Port);
} }
......
...@@ -181,14 +181,28 @@ namespace Titanium.Web.Proxy ...@@ -181,14 +181,28 @@ namespace Titanium.Web.Proxy
/// <summary> /// <summary>
/// Handle dispose of a client/server session /// Handle dispose of a client/server session
/// </summary> /// </summary>
/// <param name="client"></param> /// <param name="tcpClient"></param>
/// <param name="clientStream"></param> /// <param name="clientStream"></param>
/// <param name="clientStreamReader"></param> /// <param name="clientStreamReader"></param>
/// <param name="clientStreamWriter"></param> /// <param name="clientStreamWriter"></param>
/// <param name="args"></param> /// <param name="args"></param>
private void Dispose(TcpClient client, IDisposable clientStream, IDisposable clientStreamReader, private void Dispose(TcpClient tcpClient, IDisposable clientStream, IDisposable clientStreamReader,
IDisposable clientStreamWriter, IDisposable args) IDisposable clientStreamWriter, IDisposable args)
{ {
if (clientStream != null)
{
(clientStream as Stream).Close();
(clientStream as Stream).Dispose();
}
if (tcpClient != null)
{
tcpClient.Client.Close();
tcpClient.Close();
tcpClient.Client.Dispose();
}
if (args != null) if (args != null)
args.Dispose(); args.Dispose();
...@@ -198,11 +212,7 @@ namespace Titanium.Web.Proxy ...@@ -198,11 +212,7 @@ namespace Titanium.Web.Proxy
if (clientStreamWriter != null) if (clientStreamWriter != null)
clientStreamWriter.Dispose(); clientStreamWriter.Dispose();
if (clientStream != null)
clientStream.Dispose();
if (client != null)
client.Close();
} }
} }
} }
\ No newline at end of file
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