Commit ecfc7ff5 authored by titanium007's avatar titanium007

Remove code used for HttpWebRequest

parent c7b20f97
using System;
using System.Net.Configuration;
using System.Reflection;
namespace Titanium.Web.Proxy.Helpers
{
public class NetFrameworkHelper
{
//Fix bug in .Net 4.0 HttpWebRequest (don't use this for 4.5 and above)
//http://stackoverflow.com/questions/856885/httpwebrequest-to-url-with-dot-at-the-end
public static void UrlPeriodFix()
{
var getSyntax = typeof (UriParser).GetMethod("GetSyntax", BindingFlags.Static | BindingFlags.NonPublic);
var flagsField = typeof (UriParser).GetField("m_Flags", BindingFlags.Instance | BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
foreach (var scheme in new[] {"http", "https"})
{
var parser = (UriParser) getSyntax.Invoke(null, new object[] {scheme});
if (parser != null)
{
var flagsValue = (int) flagsField.GetValue(parser);
if ((flagsValue & 0x1000000) != 0)
flagsField.SetValue(parser, flagsValue & ~0x1000000);
}
}
}
}
// Enable/disable useUnsafeHeaderParsing.
// See http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/
public static bool ToggleAllowUnsafeHeaderParsing(bool enable)
{
//Get the assembly that contains the internal class
var assembly = Assembly.GetAssembly(typeof (SettingsSection));
if (assembly != null)
{
//Use the assembly in order to get the internal type for the internal class
var settingsSectionType = assembly.GetType("System.Net.Configuration.SettingsSectionInternal");
if (settingsSectionType != null)
{
//Use the internal static property to get an instance of the internal settings class.
//If the static instance isn't created already invoking the property will create it for us.
var anInstance = settingsSectionType.InvokeMember("Section",
BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null,
new object[] {});
if (anInstance != null)
{
//Locate the private bool field that tells the framework if unsafe header parsing is allowed
var aUseUnsafeHeaderParsing = settingsSectionType.GetField("useUnsafeHeaderParsing",
BindingFlags.NonPublic | BindingFlags.Instance);
if (aUseUnsafeHeaderParsing != null)
{
aUseUnsafeHeaderParsing.SetValue(anInstance, enable);
return true;
}
}
}
}
return false;
}
}
}
\ No newline at end of file
...@@ -26,7 +26,6 @@ namespace Titanium.Web.Proxy.Network ...@@ -26,7 +26,6 @@ namespace Titanium.Web.Proxy.Network
public string RequestHost { get; set; } public string RequestHost { get; set; }
public string RequestUrl { get; internal set; } public string RequestUrl { get; internal set; }
public string RequestHostname { get; internal set; }
internal Encoding RequestEncoding { get; set; } internal Encoding RequestEncoding { get; set; }
internal Version RequestHttpVersion { get; set; } internal Version RequestHttpVersion { get; set; }
...@@ -95,6 +94,7 @@ namespace Titanium.Web.Proxy.Network ...@@ -95,6 +94,7 @@ namespace Titanium.Web.Proxy.Network
public void SetConnection(TcpConnection Connection) public void SetConnection(TcpConnection Connection)
{ {
Connection.LastAccess = DateTime.Now;
ProxyClient = Connection; ProxyClient = Connection;
} }
......
...@@ -36,10 +36,9 @@ namespace Titanium.Web.Proxy.Network ...@@ -36,10 +36,9 @@ namespace Titanium.Web.Proxy.Network
public static TcpConnection GetClient(string Hostname, int port, bool IsSecure) public static TcpConnection GetClient(string Hostname, int port, bool IsSecure)
{ {
TcpConnection cached = null;
while (true) while (true)
{ {
TcpConnection cached = null;
lock (ConnectionCache) lock (ConnectionCache)
{ {
cached = ConnectionCache.FirstOrDefault(x => x.HostName == Hostname && x.port == port && x.IsSecure == IsSecure && x.TcpClient.Connected); cached = ConnectionCache.FirstOrDefault(x => x.HostName == Hostname && x.port == port && x.IsSecure == IsSecure && x.TcpClient.Connected);
...@@ -55,7 +54,15 @@ namespace Titanium.Web.Proxy.Network ...@@ -55,7 +54,15 @@ namespace Titanium.Web.Proxy.Network
break; break;
} }
return CreateClient(Hostname, port, IsSecure); if (cached == null)
cached = CreateClient(Hostname, port, IsSecure);
if (ConnectionCache.Where(x => x.HostName == Hostname && x.port == port && x.IsSecure == IsSecure && x.TcpClient.Connected).Count() < 2)
{
Task.Factory.StartNew(() => ReleaseClient(CreateClient(Hostname, port, IsSecure)));
}
return cached;
} }
private static TcpConnection CreateClient(string Hostname, int port, bool IsSecure) private static TcpConnection CreateClient(string Hostname, int port, bool IsSecure)
......
...@@ -59,27 +59,7 @@ namespace Titanium.Web.Proxy ...@@ -59,27 +59,7 @@ namespace Titanium.Web.Proxy
public static event EventHandler<SessionEventArgs> BeforeResponse; public static event EventHandler<SessionEventArgs> BeforeResponse;
public static void Initialize() public static void Initialize()
{ {
ServicePointManager.Expect100Continue = false;
WebRequest.DefaultWebProxy = null;
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ServicePointManager.DnsRefreshTimeout = 3 * 60 * 1000; //3 minutes
ServicePointManager.MaxServicePointIdleTime = 3 * 60 * 1000;
//HttpWebRequest certificate validation callback
ServicePointManager.ServerCertificateValidationCallback =
delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None) return true;
return false;
};
#if NET40
//Fix a bug in .NET 4.0
NetFrameworkHelper.UrlPeriodFix();
//useUnsafeHeaderParsing
#endif
NetFrameworkHelper.ToggleAllowUnsafeHeaderParsing(true);
Task.Factory.StartNew(()=>TcpConnectionManager.ClearIdleConnections()); Task.Factory.StartNew(()=>TcpConnectionManager.ClearIdleConnections());
} }
......
...@@ -115,13 +115,15 @@ namespace Titanium.Web.Proxy ...@@ -115,13 +115,15 @@ namespace Titanium.Web.Proxy
private static void HandleHttpSessionRequest(TcpClient client, string httpCmd, Stream clientStream, private static void HandleHttpSessionRequest(TcpClient client, string httpCmd, Stream clientStream,
CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string secureTunnelHostName) CustomBinaryReader clientStreamReader, StreamWriter clientStreamWriter, string secureTunnelHostName)
{ {
TcpConnection connection = null;
string lastRequestHostName = null;
while (true) while (true)
{ {
if (string.IsNullOrEmpty(httpCmd)) if (string.IsNullOrEmpty(httpCmd))
{ {
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, null); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, null);
return; break;
} }
var args = new SessionEventArgs(BUFFER_SIZE); var args = new SessionEventArgs(BUFFER_SIZE);
...@@ -156,7 +158,6 @@ namespace Titanium.Web.Proxy ...@@ -156,7 +158,6 @@ namespace Titanium.Web.Proxy
args.ProxySession.Request.RequestHeaders = new List<HttpHeader>(); args.ProxySession.Request.RequestHeaders = new List<HttpHeader>();
string tmpLine; string tmpLine;
while (!string.IsNullOrEmpty(tmpLine = clientStreamReader.ReadLine())) while (!string.IsNullOrEmpty(tmpLine = clientStreamReader.ReadLine()))
{ {
var header = tmpLine.Split(new char[] { ':' }, 2); var header = tmpLine.Split(new char[] { ':' }, 2);
...@@ -164,6 +165,7 @@ namespace Titanium.Web.Proxy ...@@ -164,6 +165,7 @@ namespace Titanium.Web.Proxy
} }
SetRequestHeaders(args.ProxySession.Request.RequestHeaders, args.ProxySession); SetRequestHeaders(args.ProxySession.Request.RequestHeaders, args.ProxySession);
if (args.ProxySession.Request.UpgradeToWebSocket) if (args.ProxySession.Request.UpgradeToWebSocket)
{ {
TcpHelper.SendRaw(clientStreamReader.BaseStream, httpCmd, args.ProxySession.Request.RequestHeaders, TcpHelper.SendRaw(clientStreamReader.BaseStream, httpCmd, args.ProxySession.Request.RequestHeaders,
...@@ -179,7 +181,7 @@ namespace Titanium.Web.Proxy ...@@ -179,7 +181,7 @@ namespace Titanium.Web.Proxy
args.Client.ClientStream = clientStream; args.Client.ClientStream = clientStream;
args.Client.ClientStreamReader = clientStreamReader; args.Client.ClientStreamReader = clientStreamReader;
args.Client.ClientStreamWriter = clientStreamWriter; args.Client.ClientStreamWriter = clientStreamWriter;
args.ProxySession.Request.RequestHostname = args.ProxySession.Request.RequestUri.Host; args.ProxySession.Request.RequestHost = args.ProxySession.Request.RequestUri.Host;
args.ProxySession.Request.RequestUrl = args.ProxySession.Request.RequestUri.OriginalString; args.ProxySession.Request.RequestUrl = args.ProxySession.Request.RequestUri.OriginalString;
args.Client.ClientPort = ((IPEndPoint)client.Client.RemoteEndPoint).Port; args.Client.ClientPort = ((IPEndPoint)client.Client.RemoteEndPoint).Port;
args.Client.ClientIpAddress = ((IPEndPoint)client.Client.RemoteEndPoint).Address; args.Client.ClientIpAddress = ((IPEndPoint)client.Client.RemoteEndPoint).Address;
...@@ -198,14 +200,19 @@ namespace Titanium.Web.Proxy ...@@ -198,14 +200,19 @@ namespace Titanium.Web.Proxy
if (args.ProxySession.Request.CancelRequest) if (args.ProxySession.Request.CancelRequest)
{ {
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args);
return; break;
} }
//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.
var connection = TcpConnectionManager.GetClient(args.ProxySession.Request.RequestUri.Host, args.ProxySession.Request.RequestUri.Port, args.IsHttps); connection = connection == null ?
args.ProxySession.SetConnection(connection); TcpConnectionManager.GetClient(args.ProxySession.Request.RequestUri.Host, args.ProxySession.Request.RequestUri.Port, args.IsHttps)
: lastRequestHostName != args.ProxySession.Request.RequestHost ? TcpConnectionManager.GetClient(args.ProxySession.Request.RequestUri.Host, args.ProxySession.Request.RequestUri.Port, args.IsHttps)
: connection;
lastRequestHostName = args.ProxySession.Request.RequestHost;
args.ProxySession.SetConnection(connection);
args.ProxySession.SendRequest(); args.ProxySession.SendRequest();
//If request was modified by user //If request was modified by user
...@@ -233,8 +240,6 @@ namespace Titanium.Web.Proxy ...@@ -233,8 +240,6 @@ namespace Titanium.Web.Proxy
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args);
return; return;
} }
else
TcpConnectionManager.ReleaseClient(connection);
// read the next request // read the next request
httpCmd = clientStreamReader.ReadLine(); httpCmd = clientStreamReader.ReadLine();
...@@ -245,8 +250,11 @@ namespace Titanium.Web.Proxy ...@@ -245,8 +250,11 @@ namespace Titanium.Web.Proxy
Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args); Dispose(client, clientStream, clientStreamReader, clientStreamWriter, args);
break; break;
} }
} }
if (connection != null)
TcpConnectionManager.ReleaseClient(connection);
} }
private static void WriteConnectResponse(StreamWriter clientStreamWriter, string httpVersion) private static void WriteConnectResponse(StreamWriter clientStreamWriter, string httpVersion)
......
...@@ -93,7 +93,6 @@ ...@@ -93,7 +93,6 @@
<Compile Include="RequestHandler.cs" /> <Compile Include="RequestHandler.cs" />
<Compile Include="ResponseHandler.cs" /> <Compile Include="ResponseHandler.cs" />
<Compile Include="Helpers\CustomBinaryReader.cs" /> <Compile Include="Helpers\CustomBinaryReader.cs" />
<Compile Include="Helpers\NetFramework.cs" />
<Compile Include="Helpers\Compression.cs" /> <Compile Include="Helpers\Compression.cs" />
<Compile Include="ProxyServer.cs" /> <Compile Include="ProxyServer.cs" />
<Compile Include="EventArguments\SessionEventArgs.cs" /> <Compile Include="EventArguments\SessionEventArgs.cs" />
......
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