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
internal string ReadLine()
{
var buf = new char[1];
var readBuffer = new StringBuilder();
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();
}
if (buf[0] == '\0')
if (buf == '\0')
{
return readBuffer.ToString();
}
readBuffer.Append(buf[0]);
readBuffer.Append(buf);
lastChar = buf[0];
lastChar = buf;
}
return readBuffer.ToString();
}
catch (IOException)
{
......@@ -42,7 +43,6 @@ namespace Titanium.Web.Proxy.Helpers
}
}
internal List<string> ReadAllLines()
{
string tmpLine;
......
......@@ -61,7 +61,7 @@ namespace Titanium.Web.Proxy
{
ServicePointManager.Expect100Continue = false;
WebRequest.DefaultWebProxy = null;
ServicePointManager.DefaultConnectionLimit = 10;
ServicePointManager.DefaultConnectionLimit = int.MaxValue;
ServicePointManager.DnsRefreshTimeout = 3 * 60 * 1000; //3 minutes
ServicePointManager.MaxServicePointIdleTime = 3 * 60 * 1000;
......
This diff is collapsed.
......@@ -15,13 +15,12 @@ namespace Titanium.Web.Proxy
partial class ProxyServer
{
//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
{
args.ServerResponse = (HttpWebResponse)args.ProxyRequest.EndGetResponse(asynchronousResult);
args.ServerResponse = (HttpWebResponse)args.ProxyRequest.GetResponse();
}
catch (WebException webEx)
{
......@@ -132,6 +131,8 @@ namespace Titanium.Web.Proxy
{
if (headers != null)
{
FixProxyHeaders(headers);
foreach (var header in headers)
{
responseWriter.WriteLine(header.ToString());
......@@ -141,10 +142,24 @@ namespace Titanium.Web.Proxy
responseWriter.WriteLine();
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,
bool isChunked)
{
FixProxyHeaders(headers);
if (!isChunked)
{
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