Commit 65be519e authored by titanium007's avatar titanium007

Issue #27

Improve performance by avoiding new Tasks for each requests
parent ca13d730
...@@ -14,27 +14,28 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -14,27 +14,28 @@ namespace Titanium.Web.Proxy.Helpers
internal string ReadLine() internal string ReadLine()
{ {
var buf = new char[1];
var readBuffer = new StringBuilder(); var readBuffer = new StringBuilder();
try try
{ {
var lastChar = new char(); var lastChar = default(char);
while ((Read(buf, 0, 1)) > 0) while (true)
{ {
if (lastChar == '\r' && buf[0] == '\n') var buf = ReadChar();
if (lastChar == '\r' && buf == '\n')
{ {
return readBuffer.Remove(readBuffer.Length - 1, 1).ToString(); return readBuffer.Remove(readBuffer.Length - 1, 1).ToString();
} }
if (buf[0] == '\0') if (buf == '\0')
{ {
return readBuffer.ToString(); return readBuffer.ToString();
} }
readBuffer.Append(buf[0]); readBuffer.Append(buf);
lastChar = buf[0]; lastChar = buf;
} }
return readBuffer.ToString();
} }
catch (IOException) catch (IOException)
{ {
...@@ -42,7 +43,6 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -42,7 +43,6 @@ namespace Titanium.Web.Proxy.Helpers
} }
} }
internal List<string> ReadAllLines() internal List<string> ReadAllLines()
{ {
string tmpLine; string tmpLine;
......
...@@ -61,7 +61,7 @@ namespace Titanium.Web.Proxy ...@@ -61,7 +61,7 @@ namespace Titanium.Web.Proxy
{ {
ServicePointManager.Expect100Continue = false; ServicePointManager.Expect100Continue = false;
WebRequest.DefaultWebProxy = null; WebRequest.DefaultWebProxy = null;
ServicePointManager.DefaultConnectionLimit = 10; ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ServicePointManager.DnsRefreshTimeout = 3 * 60 * 1000; //3 minutes ServicePointManager.DnsRefreshTimeout = 3 * 60 * 1000; //3 minutes
ServicePointManager.MaxServicePointIdleTime = 3 * 60 * 1000; ServicePointManager.MaxServicePointIdleTime = 3 * 60 * 1000;
......
This diff is collapsed.
...@@ -15,13 +15,12 @@ namespace Titanium.Web.Proxy ...@@ -15,13 +15,12 @@ namespace Titanium.Web.Proxy
partial class ProxyServer partial class ProxyServer
{ {
//Called asynchronously when a request was successfully and we received the response //Called asynchronously when a request was successfully and we received the response
private static void HandleHttpSessionResponse(IAsyncResult asynchronousResult) private static void HandleHttpSessionResponse(SessionEventArgs args)
{ {
var args = (SessionEventArgs)asynchronousResult.AsyncState;
try try
{ {
args.ServerResponse = (HttpWebResponse)args.ProxyRequest.EndGetResponse(asynchronousResult); args.ServerResponse = (HttpWebResponse)args.ProxyRequest.GetResponse();
} }
catch (WebException webEx) catch (WebException webEx)
{ {
...@@ -132,6 +131,8 @@ namespace Titanium.Web.Proxy ...@@ -132,6 +131,8 @@ namespace Titanium.Web.Proxy
{ {
if (headers != null) if (headers != null)
{ {
FixProxyHeaders(headers);
foreach (var header in headers) foreach (var header in headers)
{ {
responseWriter.WriteLine(header.ToString()); responseWriter.WriteLine(header.ToString());
...@@ -141,10 +142,24 @@ namespace Titanium.Web.Proxy ...@@ -141,10 +142,24 @@ namespace Titanium.Web.Proxy
responseWriter.WriteLine(); responseWriter.WriteLine();
responseWriter.Flush(); responseWriter.Flush();
} }
private static void FixProxyHeaders(List<HttpHeader> headers)
{
//If proxy-connection close was returned inform to close the connection
if (headers.Any(x => x.Name.ToLower() == "proxy-connection" && x.Value.ToLower() == "close"))
if (headers.Any(x => x.Name.ToLower() == "connection") == false)
{
headers.Add(new HttpHeader("connection", "close"));
headers.RemoveAll(x => x.Name.ToLower() == "proxy-connection");
}
else
headers.Find(x => x.Name.ToLower() == "connection").Value = "close";
}
private static void WriteResponseHeaders(StreamWriter responseWriter, List<HttpHeader> headers, int length, private static void WriteResponseHeaders(StreamWriter responseWriter, List<HttpHeader> headers, int length,
bool isChunked) bool isChunked)
{ {
FixProxyHeaders(headers);
if (!isChunked) if (!isChunked)
{ {
if (headers.Any(x => x.Name.ToLower() == "content-length") == false) if (headers.Any(x => x.Name.ToLower() == "content-length") == false)
......
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