Unverified Commit ba234a9c authored by justcoding121's avatar justcoding121 Committed by GitHub

Merge pull request #436 from justcoding121/master

Beta with small bug fixes in connection pool
parents 3d443dd7 4c092efd
......@@ -23,7 +23,7 @@ namespace Titanium.Web.Proxy.Examples.Basic
public ProxyTestController()
{
proxyServer = new ProxyServer();
proxyServer.EnableConnectionPool = true;
//proxyServer.EnableConnectionPool = false;
// generate root certificate without storing it in file system
//proxyServer.CertificateManager.CreateRootCertificate(false);
......
......@@ -463,7 +463,9 @@ namespace Titanium.Web.Proxy.EventArguments
/// </summary>
/// <param name="html">HTML content to sent.</param>
/// <param name="headers">HTTP response headers.</param>
public void Ok(string html, Dictionary<string, HttpHeader> headers = null)
/// <param name="closeServerConnection">Close the server connection?</param>
public void Ok(string html, Dictionary<string, HttpHeader> headers = null,
bool closeServerConnection = false)
{
var response = new OkResponse();
if (headers != null)
......@@ -474,7 +476,7 @@ namespace Titanium.Web.Proxy.EventArguments
response.HttpVersion = WebSession.Request.HttpVersion;
response.Body = response.Encoding.GetBytes(html ?? string.Empty);
Respond(response);
Respond(response, closeServerConnection);
}
/// <summary>
......@@ -483,14 +485,16 @@ namespace Titanium.Web.Proxy.EventArguments
/// </summary>
/// <param name="result">The html content bytes.</param>
/// <param name="headers">The HTTP headers.</param>
public void Ok(byte[] result, Dictionary<string, HttpHeader> headers = null)
/// <param name="closeServerConnection">Close the server connection?</param>
public void Ok(byte[] result, Dictionary<string, HttpHeader> headers = null,
bool closeServerConnection = false)
{
var response = new OkResponse();
response.Headers.AddHeaders(headers);
response.HttpVersion = WebSession.Request.HttpVersion;
response.Body = result;
Respond(response);
Respond(response, closeServerConnection);
}
/// <summary>
......@@ -501,15 +505,16 @@ namespace Titanium.Web.Proxy.EventArguments
/// <param name="html">The html content.</param>
/// <param name="status">The HTTP status code.</param>
/// <param name="headers">The HTTP headers.</param>
/// <returns></returns>
public void GenericResponse(string html, HttpStatusCode status, Dictionary<string, HttpHeader> headers = null)
/// <param name="closeServerConnection">Close the server connection?</param>
public void GenericResponse(string html, HttpStatusCode status,
Dictionary<string, HttpHeader> headers = null, bool closeServerConnection = false)
{
var response = new GenericResponse(status);
response.HttpVersion = WebSession.Request.HttpVersion;
response.Headers.AddHeaders(headers);
response.Body = response.Encoding.GetBytes(html ?? string.Empty);
Respond(response);
Respond(response, closeServerConnection);
}
/// <summary>
......@@ -519,51 +524,57 @@ namespace Titanium.Web.Proxy.EventArguments
/// <param name="result">The bytes to sent.</param>
/// <param name="status">The HTTP status code.</param>
/// <param name="headers">The HTTP headers.</param>
/// <returns></returns>
public void GenericResponse(byte[] result, HttpStatusCode status, Dictionary<string, HttpHeader> headers)
/// <param name="closeServerConnection">Close the server connection?</param>
public void GenericResponse(byte[] result, HttpStatusCode status,
Dictionary<string, HttpHeader> headers, bool closeServerConnection = false)
{
var response = new GenericResponse(status);
response.HttpVersion = WebSession.Request.HttpVersion;
response.Headers.AddHeaders(headers);
response.Body = result;
Respond(response);
Respond(response, closeServerConnection);
}
/// <summary>
/// Redirect to provided URL.
/// </summary>
/// <param name="url">The URL to redirect.</param>
/// <returns></returns>
public void Redirect(string url)
/// <param name="closeServerConnection">Close the server connection?</param>
public void Redirect(string url, bool closeServerConnection = false)
{
var response = new RedirectResponse();
response.HttpVersion = WebSession.Request.HttpVersion;
response.Headers.AddHeader(KnownHeaders.Location, url);
response.Body = emptyData;
Respond(response);
Respond(response, closeServerConnection);
}
/// <summary>
/// Respond with given response object to client.
/// </summary>
/// <param name="response">The response object.</param>
public void Respond(Response response)
/// <param name="closeServerConnection">Close the server connection?</param>
public void Respond(Response response, bool closeServerConnection = false)
{
//request already send.
if (WebSession.Request.Locked)
{
//response already received from server and ready to be sent to client.
if (WebSession.Response.Locked)
{
throw new Exception("You cannot call this function after response is sent to the client.");
}
//response already received from server but not yet ready to sent to client.
response.Locked = true;
response.TerminateResponse = WebSession.Response.TerminateResponse;
WebSession.Response = response;
}
else
{
//request not yet sent.
WebSession.Request.Locked = true;
response.Locked = true;
......@@ -571,6 +582,11 @@ namespace Titanium.Web.Proxy.EventArguments
WebSession.Request.CancelRequest = true;
}
if(closeServerConnection)
{
TerminateServerConnection();
}
}
/// <summary>
......
......@@ -155,10 +155,10 @@ namespace Titanium.Web.Proxy
public bool Enable100ContinueBehaviour { get; set; }
/// <summary>
/// Should we enable experimental Tcp server connection pool?
/// Defaults to false.
/// Should we enable server connection pool?
/// Defaults to true.
/// </summary>
public bool EnableConnectionPool { get; set; }
public bool EnableConnectionPool { get; set; } = true;
/// <summary>
/// Buffer size used throughout this proxy.
......
......@@ -182,14 +182,15 @@ namespace Titanium.Web.Proxy
}
//If prefetch task is available.
//Delay awaiting prefect task as far as possible.
if (serverConnection == null && prefetchTask != null)
{
serverConnection = await prefetchTask;
prefetchTask = null;
}
// create a new connection if cache key changes
// create a new connection if cache key changes.
// only gets hit when connection pool is disabled.
// or when prefetch task has a unexpectedly different connection.
if (serverConnection != null
&& (await getConnectionCacheKey(args, false,
clientConnection.NegotiatedApplicationProtocol)
......@@ -218,6 +219,7 @@ namespace Titanium.Web.Proxy
await handleWebSocketUpgrade(httpCmd, args, request,
response, clientStream, clientStreamWriter,
serverConnection, cancellationTokenSource, cancellationToken);
closeServerConnection = true;
return;
}
......@@ -245,8 +247,10 @@ namespace Titanium.Web.Proxy
break;
}
if (args.WebSession.ServerConnection == null)
//user requested
if (args.WebSession.Response.TerminateResponse)
{
closeServerConnection = true;
return;
}
......
......@@ -62,11 +62,6 @@ namespace Titanium.Web.Proxy
// syphon out the response body from server before setting the new body
await args.SyphonOutBodyAsync(false, cancellationToken);
}
else
{
await tcpConnectionFactory.Release(args.WebSession.ServerConnection, true);
args.WebSession.ServerConnection = null;
}
return;
}
......
......@@ -445,8 +445,8 @@ Defaults to false.</p>
<a id="Titanium_Web_Proxy_ProxyServer_EnableConnectionPool_" data-uid="Titanium.Web.Proxy.ProxyServer.EnableConnectionPool*"></a>
<h4 id="Titanium_Web_Proxy_ProxyServer_EnableConnectionPool" data-uid="Titanium.Web.Proxy.ProxyServer.EnableConnectionPool">EnableConnectionPool</h4>
<div class="markdown level1 summary"><p>Should we enable experimental Tcp server connection pool?
Defaults to false.</p>
<div class="markdown level1 summary"><p>Should we enable server connection pool?
Defaults to true.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
......
This diff is collapsed.
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