Commit 44ba131c authored by justcoding121's avatar justcoding121

refactor params

parent 3ea9f89a
...@@ -16,21 +16,30 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -16,21 +16,30 @@ namespace Titanium.Web.Proxy.Helpers
internal class TcpHelper internal class TcpHelper
{ {
/// <summary> /// <summary>
/// relays the input clientStream to the server at the specified host name & port with the given httpCmd & headers as prefix /// relays the input clientStream to the server at the specified host name & port with the given httpCmd & headers as prefix
/// Usefull for websocket requests /// Usefull for websocket requests
/// </summary> /// </summary>
/// <param name="clientStream"></param> /// <param name="bufferSize"></param>
/// <param name="connectionTimeOutSeconds"></param>
/// <param name="remoteHostName"></param>
/// <param name="httpCmd"></param> /// <param name="httpCmd"></param>
/// <param name="httpVersion"></param>
/// <param name="requestHeaders"></param> /// <param name="requestHeaders"></param>
/// <param name="hostName"></param>
/// <param name="tunnelPort"></param>
/// <param name="isHttps"></param> /// <param name="isHttps"></param>
/// <param name="remotePort"></param>
/// <param name="supportedProtocols"></param>
/// <param name="remoteCertificateValidationCallback"></param>
/// <param name="localCertificateSelectionCallback"></param>
/// <param name="clientStream"></param>
/// <param name="tcpConnectionFactory"></param>
/// <returns></returns> /// <returns></returns>
internal static async Task SendRaw(TcpConnectionFactory tcpConnectionFactory, Stream clientStream, string httpCmd, Version version, internal static async Task SendRaw(int bufferSize, int connectionTimeOutSeconds,
Dictionary<string, HttpHeader> requestHeaders, string hostName, int bufferSize, string remoteHostName, int remotePort, string httpCmd, Version httpVersion, Dictionary<string, HttpHeader> requestHeaders,
int tunnelPort, bool isHttps, SslProtocols supportedProtocols, int connectionTimeOutSeconds, bool isHttps, SslProtocols supportedProtocols,
RemoteCertificateValidationCallback remoteCertificateValidationCallback, LocalCertificateSelectionCallback localCertificateSelectionCallback) RemoteCertificateValidationCallback remoteCertificateValidationCallback, LocalCertificateSelectionCallback localCertificateSelectionCallback,
Stream clientStream, TcpConnectionFactory tcpConnectionFactory)
{ {
//prepare the prefix content //prepare the prefix content
StringBuilder sb = null; StringBuilder sb = null;
...@@ -56,8 +65,13 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -56,8 +65,13 @@ namespace Titanium.Web.Proxy.Helpers
sb.Append(Environment.NewLine); sb.Append(Environment.NewLine);
} }
var tcpConnection = await tcpConnectionFactory.GetClient(hostName, tunnelPort, isHttps, version, null, null, bufferSize,
supportedProtocols, connectionTimeOutSeconds, remoteCertificateValidationCallback, localCertificateSelectionCallback); var tcpConnection = await tcpConnectionFactory.CreateClient(bufferSize, connectionTimeOutSeconds,
remoteHostName, remotePort,
httpVersion, isHttps,
supportedProtocols, remoteCertificateValidationCallback, localCertificateSelectionCallback,
null, null, clientStream);
TcpClient tunnelClient = tcpConnection.TcpClient; TcpClient tunnelClient = tcpConnection.TcpClient;
Stream tunnelStream = tcpConnection.Stream; Stream tunnelStream = tcpConnection.Stream;
......
...@@ -17,36 +17,28 @@ namespace Titanium.Web.Proxy.Network ...@@ -17,36 +17,28 @@ namespace Titanium.Web.Proxy.Network
{ {
/// <summary> /// <summary>
/// Get a TcpConnection to the specified host, port optionally HTTPS and a particular HTTP version /// Creates a TCP connection to server
/// </summary> /// </summary>
/// <param name="hostname"></param> /// <param name="bufferSize"></param>
/// <param name="port"></param> /// <param name="connectionTimeOutSeconds"></param>
/// <param name="remoteHostName"></param>
/// <param name="httpCmd"></param>
/// <param name="httpVersion"></param>
/// <param name="isHttps"></param> /// <param name="isHttps"></param>
/// <param name="version"></param> /// <param name="remotePort"></param>
/// <param name="supportedSslProtocols"></param>
/// <param name="remoteCertificateValidationCallback"></param>
/// <param name="localCertificateSelectionCallback"></param>
/// <param name="externalHttpProxy"></param>
/// <param name="externalHttpsProxy"></param>
/// <param name="clientStream"></param>
/// <returns></returns> /// <returns></returns>
internal async Task<TcpConnection> GetClient(string hostname, int port, bool isHttps, Version version, internal async Task<TcpConnection> CreateClient(int bufferSize, int connectionTimeOutSeconds,
ExternalProxy upStreamHttpProxy, ExternalProxy upStreamHttpsProxy, int bufferSize, SslProtocols supportedSslProtocols, string remoteHostName, int remotePort, Version httpVersion,
int connectionTimeOutSeconds, bool isHttps, SslProtocols supportedSslProtocols,
RemoteCertificateValidationCallback remoteCertificateValidationCallBack, RemoteCertificateValidationCallback remoteCertificateValidationCallback, LocalCertificateSelectionCallback localCertificateSelectionCallback,
LocalCertificateSelectionCallback localCertificateSelectionCallback) ExternalProxy externalHttpProxy, ExternalProxy externalHttpsProxy,
{ Stream clientStream)
//not in cache so create and return
return await CreateClient(hostname, port, isHttps, version, connectionTimeOutSeconds, upStreamHttpProxy, upStreamHttpsProxy, bufferSize, supportedSslProtocols,
remoteCertificateValidationCallBack, localCertificateSelectionCallback);
}
/// <summary>
/// Create connection to a particular host/port optionally with SSL and a particular HTTP version
/// </summary>
/// <param name="hostname"></param>
/// <param name="port"></param>
/// <param name="isHttps"></param>
/// <param name="version"></param>
/// <returns></returns>
private async Task<TcpConnection> CreateClient(string hostname, int port, bool isHttps, Version version, int connectionTimeOutSeconds,
ExternalProxy upStreamHttpProxy, ExternalProxy upStreamHttpsProxy, int bufferSize, SslProtocols supportedSslProtocols,
RemoteCertificateValidationCallback remoteCertificateValidationCallBack, LocalCertificateSelectionCallback localCertificateSelectionCallback)
{ {
TcpClient client; TcpClient client;
Stream stream; Stream stream;
...@@ -56,15 +48,15 @@ namespace Titanium.Web.Proxy.Network ...@@ -56,15 +48,15 @@ namespace Titanium.Web.Proxy.Network
SslStream sslStream = null; SslStream sslStream = null;
//If this proxy uses another external proxy then create a tunnel request for HTTPS connections //If this proxy uses another external proxy then create a tunnel request for HTTPS connections
if (upStreamHttpsProxy != null) if (externalHttpsProxy != null)
{ {
client = new TcpClient(upStreamHttpsProxy.HostName, upStreamHttpsProxy.Port); client = new TcpClient(externalHttpsProxy.HostName, externalHttpsProxy.Port);
stream = client.GetStream(); stream = client.GetStream();
using (var writer = new StreamWriter(stream, Encoding.ASCII, bufferSize, true)) using (var writer = new StreamWriter(stream, Encoding.ASCII, bufferSize, true))
{ {
await writer.WriteLineAsync(string.Format("CONNECT {0}:{1} {2}", hostname, port, version)); await writer.WriteLineAsync(string.Format("CONNECT {0}:{1} {2}", remoteHostName, remotePort, httpVersion));
await writer.WriteLineAsync(string.Format("Host: {0}:{1}", hostname, port)); await writer.WriteLineAsync(string.Format("Host: {0}:{1}", remoteHostName, remotePort));
await writer.WriteLineAsync("Connection: Keep-Alive"); await writer.WriteLineAsync("Connection: Keep-Alive");
await writer.WriteLineAsync(); await writer.WriteLineAsync();
await writer.FlushAsync(); await writer.FlushAsync();
...@@ -85,16 +77,16 @@ namespace Titanium.Web.Proxy.Network ...@@ -85,16 +77,16 @@ namespace Titanium.Web.Proxy.Network
} }
else else
{ {
client = new TcpClient(hostname, port); client = new TcpClient(remoteHostName, remotePort);
stream = client.GetStream(); stream = client.GetStream();
} }
try try
{ {
sslStream = new SslStream(stream, true, remoteCertificateValidationCallBack, sslStream = new SslStream(stream, true, remoteCertificateValidationCallback,
localCertificateSelectionCallback); localCertificateSelectionCallback);
await sslStream.AuthenticateAsClientAsync(hostname, null, supportedSslProtocols, false); await sslStream.AuthenticateAsClientAsync(remoteHostName, null, supportedSslProtocols, false);
stream = sslStream; stream = sslStream;
} }
...@@ -110,14 +102,14 @@ namespace Titanium.Web.Proxy.Network ...@@ -110,14 +102,14 @@ namespace Titanium.Web.Proxy.Network
} }
else else
{ {
if (upStreamHttpProxy != null) if (externalHttpProxy != null)
{ {
client = new TcpClient(upStreamHttpProxy.HostName, upStreamHttpProxy.Port); client = new TcpClient(externalHttpProxy.HostName, externalHttpProxy.Port);
stream = client.GetStream(); stream = client.GetStream();
} }
else else
{ {
client = new TcpClient(hostname, port); client = new TcpClient(remoteHostName, remotePort);
stream = client.GetStream(); stream = client.GetStream();
} }
} }
...@@ -130,13 +122,13 @@ namespace Titanium.Web.Proxy.Network ...@@ -130,13 +122,13 @@ namespace Titanium.Web.Proxy.Network
return new TcpConnection() return new TcpConnection()
{ {
HostName = hostname, HostName = remoteHostName,
port = port, port = remotePort,
IsHttps = isHttps, IsHttps = isHttps,
TcpClient = client, TcpClient = client,
StreamReader = new CustomBinaryReader(stream), StreamReader = new CustomBinaryReader(stream),
Stream = stream, Stream = stream,
Version = version Version = httpVersion
}; };
} }
......
...@@ -125,11 +125,13 @@ namespace Titanium.Web.Proxy ...@@ -125,11 +125,13 @@ namespace Titanium.Web.Proxy
//write back successfull CONNECT response //write back successfull CONNECT response
await WriteConnectResponse(clientStreamWriter, version); await WriteConnectResponse(clientStreamWriter, version);
//Just relay the request/response without decrypting it
await TcpHelper.SendRaw(tcpConnectionFactory, clientStream, null, version, null, httpRemoteUri.Host, BUFFER_SIZE, await TcpHelper.SendRaw(BUFFER_SIZE, ConnectionTimeOutSeconds, httpRemoteUri.Host, httpRemoteUri.Port,
httpRemoteUri.Port, false, SupportedSslProtocols, ConnectionTimeOutSeconds, httpCmd, version, null,
new RemoteCertificateValidationCallback(ValidateServerCertificate), false, SupportedSslProtocols,
new LocalCertificateSelectionCallback(SelectClientCertificate)); new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectClientCertificate),
clientStream, tcpConnectionFactory);
Dispose(clientStream, clientStreamReader, clientStreamWriter, null); Dispose(clientStream, clientStreamReader, clientStreamWriter, null);
return; return;
...@@ -214,7 +216,7 @@ namespace Titanium.Web.Proxy ...@@ -214,7 +216,7 @@ namespace Titanium.Web.Proxy
CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string httpsHostName) CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string httpsHostName)
{ {
TcpConnection connection = null; TcpConnection connection = null;
string lastConnectionKey = null;
//Loop through each subsequest request on this particular client connection //Loop through each subsequest request on this particular client connection
//(assuming HTTP connection is kept alive by client) //(assuming HTTP connection is kept alive by client)
while (true) while (true)
...@@ -236,14 +238,14 @@ namespace Titanium.Web.Proxy ...@@ -236,14 +238,14 @@ namespace Titanium.Web.Proxy
var httpMethod = httpCmdSplit[0]; var httpMethod = httpCmdSplit[0];
//find the request HTTP version //find the request HTTP version
Version version = new Version(1, 1); Version httpVersion = new Version(1, 1);
if (httpCmdSplit.Length == 3) if (httpCmdSplit.Length == 3)
{ {
var httpVersion = httpCmdSplit[2].ToLower().Trim(); var httpVersionString = httpCmdSplit[2].ToLower().Trim();
if (httpVersion == "http/1.0") if (httpVersionString == "http/1.0")
{ {
version = new Version(1, 0); httpVersion = new Version(1, 0);
} }
} }
...@@ -287,7 +289,7 @@ namespace Titanium.Web.Proxy ...@@ -287,7 +289,7 @@ namespace Titanium.Web.Proxy
args.WebSession.Request.RequestUri = httpRemoteUri; args.WebSession.Request.RequestUri = httpRemoteUri;
args.WebSession.Request.Method = httpMethod; args.WebSession.Request.Method = httpMethod;
args.WebSession.Request.HttpVersion = version; args.WebSession.Request.HttpVersion = httpVersion;
args.ProxyClient.ClientStream = clientStream; args.ProxyClient.ClientStream = clientStream;
args.ProxyClient.ClientStreamReader = clientStreamReader; args.ProxyClient.ClientStreamReader = clientStreamReader;
args.ProxyClient.ClientStreamWriter = clientStreamWriter; args.ProxyClient.ClientStreamWriter = clientStreamWriter;
...@@ -312,10 +314,11 @@ namespace Titanium.Web.Proxy ...@@ -312,10 +314,11 @@ namespace Titanium.Web.Proxy
//if upgrading to websocket then relay the requet without reading the contents //if upgrading to websocket then relay the requet without reading the contents
if (args.WebSession.Request.UpgradeToWebSocket) if (args.WebSession.Request.UpgradeToWebSocket)
{ {
await TcpHelper.SendRaw(tcpConnectionFactory, clientStream, httpCmd, version, args.WebSession.Request.RequestHeaders, await TcpHelper.SendRaw(BUFFER_SIZE, ConnectionTimeOutSeconds, httpRemoteUri.Host, httpRemoteUri.Port,
httpRemoteUri.Host, BUFFER_SIZE, httpRemoteUri.Port, args.IsHttps, SupportedSslProtocols, ConnectionTimeOutSeconds, httpCmd, httpVersion, args.WebSession.Request.RequestHeaders, args.IsHttps,
new RemoteCertificateValidationCallback(ValidateServerCertificate), SupportedSslProtocols, new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectClientCertificate)); new LocalCertificateSelectionCallback(SelectClientCertificate),
clientStream, tcpConnectionFactory);
Dispose(clientStream, clientStreamReader, clientStreamWriter, args); Dispose(clientStream, clientStreamReader, clientStreamWriter, args);
break; break;
...@@ -324,11 +327,12 @@ namespace Titanium.Web.Proxy ...@@ -324,11 +327,12 @@ namespace Titanium.Web.Proxy
//construct the web request that we are going to issue on behalf of the client. //construct the web request that we are going to issue on behalf of the client.
if (connection == null) if (connection == null)
{ {
connection = await tcpConnectionFactory.GetClient(args.WebSession.Request.RequestUri.Host, connection = await tcpConnectionFactory.CreateClient(BUFFER_SIZE, ConnectionTimeOutSeconds,
args.WebSession.Request.RequestUri.Port, args.IsHttps, version, args.WebSession.Request.RequestUri.Host, args.WebSession.Request.RequestUri.Port, httpVersion,
UpStreamHttpProxy, UpStreamHttpsProxy, BUFFER_SIZE, SupportedSslProtocols, ConnectionTimeOutSeconds, args.IsHttps, SupportedSslProtocols,
new RemoteCertificateValidationCallback(ValidateServerCertificate), new RemoteCertificateValidationCallback(ValidateServerCertificate),
new LocalCertificateSelectionCallback(SelectClientCertificate)); new LocalCertificateSelectionCallback(SelectClientCertificate),
UpStreamHttpProxy, UpStreamHttpsProxy, clientStream);
} }
args.WebSession.Request.RequestLocked = true; args.WebSession.Request.RequestLocked = true;
......
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