Skip to content
This repository has been archived by the owner on Jul 9, 2023. It is now read-only.

Commit

Permalink
#495 Add Dns Resolution datetime to timeline
Browse files Browse the repository at this point in the history
  • Loading branch information
justcoding121 committed Sep 27, 2018
1 parent 87ec92c commit 066d430
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 34 deletions.
4 changes: 2 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
"**/*.Basic.csproj/": true,
"**/*.Docs.csproj/": true,
"**/*.Proxy.csproj/": true,
"**/*.Proxy.csproj" : true
"**/*.Mono.csproj" : true
},
"search.exclude": {
"**/.build": true,
Expand All @@ -32,6 +32,6 @@
"**/*.Basic.csproj/": true,
"**/*.Docs.csproj/": true,
"**/*.Proxy.csproj/": true,
"**/*.Proxy.csproj" : true
"**/*.Mono.csproj" : true
}
}
1 change: 1 addition & 0 deletions omnisharp.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"fileOptions": {
"excludeSearchPatterns": [
"**/*.sln",
"**/*.Docs.csproj",
"**/tests/",
"**/Titanium.Web.Proxy.Examples.Wpf/",
Expand Down
56 changes: 30 additions & 26 deletions src/Titanium.Web.Proxy/Network/Tcp/TcpConnectionFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ internal string GetConnectionCacheKey(string remoteHostName, int remotePort,
/// <summary>
/// Gets the connection cache key.
/// </summary>
/// <param name="args">The session event arguments.</param>
/// <param name="session">The session event arguments.</param>
/// <param name="applicationProtocol"></param>
/// <returns></returns>
internal async Task<string> GetConnectionCacheKey(ProxyServer server, SessionEventArgsBase args,
internal async Task<string> GetConnectionCacheKey(ProxyServer server, SessionEventArgsBase session,
SslApplicationProtocol applicationProtocol)
{
List<SslApplicationProtocol> applicationProtocols = null;
Expand All @@ -90,32 +90,32 @@ internal async Task<string> GetConnectionCacheKey(ProxyServer server, SessionEve

ExternalProxy customUpStreamProxy = null;

bool isHttps = args.IsHttps;
bool isHttps = session.IsHttps;
if (server.GetCustomUpStreamProxyFunc != null)
{
customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(args);
customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(session);
}

args.CustomUpStreamProxyUsed = customUpStreamProxy;
session.CustomUpStreamProxyUsed = customUpStreamProxy;

return GetConnectionCacheKey(
args.WebSession.Request.RequestUri.Host,
args.WebSession.Request.RequestUri.Port,
session.WebSession.Request.RequestUri.Host,
session.WebSession.Request.RequestUri.Port,
isHttps, applicationProtocols,
server, args.WebSession.UpStreamEndPoint ?? server.UpStreamEndPoint,
server, session.WebSession.UpStreamEndPoint ?? server.UpStreamEndPoint,
customUpStreamProxy ?? (isHttps ? server.UpStreamHttpsProxy : server.UpStreamHttpProxy));
}


/// <summary>
/// Create a server connection.
/// </summary>
/// <param name="args">The session event arguments.</param>
/// <param name="session">The session event arguments.</param>
/// <param name="isConnect">Is this a CONNECT request.</param>
/// <param name="applicationProtocol"></param>
/// <param name="cancellationToken">The cancellation token for this async task.</param>
/// <returns></returns>
internal Task<TcpServerConnection> GetServerConnection(ProxyServer server, SessionEventArgsBase args, bool isConnect,
internal Task<TcpServerConnection> GetServerConnection(ProxyServer server, SessionEventArgsBase session, bool isConnect,
SslApplicationProtocol applicationProtocol, bool noCache, CancellationToken cancellationToken)
{
List<SslApplicationProtocol> applicationProtocols = null;
Expand All @@ -124,36 +124,36 @@ internal Task<TcpServerConnection> GetServerConnection(ProxyServer server, Sessi
applicationProtocols = new List<SslApplicationProtocol> { applicationProtocol };
}

return GetServerConnection(server, args, isConnect, applicationProtocols, noCache, cancellationToken);
return GetServerConnection(server, session, isConnect, applicationProtocols, noCache, cancellationToken);
}

/// <summary>
/// Create a server connection.
/// </summary>
/// <param name="args">The session event arguments.</param>
/// <param name="session">The session event arguments.</param>
/// <param name="isConnect">Is this a CONNECT request.</param>
/// <param name="applicationProtocols"></param>
/// <param name="cancellationToken">The cancellation token for this async task.</param>
/// <returns></returns>
internal async Task<TcpServerConnection> GetServerConnection(ProxyServer server, SessionEventArgsBase args, bool isConnect,
internal async Task<TcpServerConnection> GetServerConnection(ProxyServer server, SessionEventArgsBase session, bool isConnect,
List<SslApplicationProtocol> applicationProtocols, bool noCache, CancellationToken cancellationToken)
{
ExternalProxy customUpStreamProxy = null;

bool isHttps = args.IsHttps;
bool isHttps = session.IsHttps;
if (server.GetCustomUpStreamProxyFunc != null)
{
customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(args);
customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(session);
}

args.CustomUpStreamProxyUsed = customUpStreamProxy;
session.CustomUpStreamProxyUsed = customUpStreamProxy;

return await GetServerConnection(
args.WebSession.Request.RequestUri.Host,
args.WebSession.Request.RequestUri.Port,
args.WebSession.Request.HttpVersion,
session.WebSession.Request.RequestUri.Host,
session.WebSession.Request.RequestUri.Port,
session.WebSession.Request.HttpVersion,
isHttps, applicationProtocols, isConnect,
server, args.WebSession.UpStreamEndPoint ?? server.UpStreamEndPoint,
server, session, session.WebSession.UpStreamEndPoint ?? server.UpStreamEndPoint,
customUpStreamProxy ?? (isHttps ? server.UpStreamHttpsProxy : server.UpStreamHttpProxy),
noCache, cancellationToken);
}
Expand All @@ -174,7 +174,7 @@ internal async Task<TcpServerConnection> GetServerConnection(ProxyServer server,
/// <returns></returns>
internal async Task<TcpServerConnection> GetServerConnection(string remoteHostName, int remotePort,
Version httpVersion, bool isHttps, List<SslApplicationProtocol> applicationProtocols, bool isConnect,
ProxyServer proxyServer, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy,
ProxyServer proxyServer, SessionEventArgsBase session, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy,
bool noCache, CancellationToken cancellationToken)
{
var cacheKey = GetConnectionCacheKey(remoteHostName, remotePort,
Expand Down Expand Up @@ -205,7 +205,7 @@ internal async Task<TcpServerConnection> GetServerConnection(string remoteHostNa
}

var connection = await createServerConnection(remoteHostName, remotePort, httpVersion, isHttps,
applicationProtocols, isConnect, proxyServer, upStreamEndPoint, externalProxy, cancellationToken);
applicationProtocols, isConnect, proxyServer, session, upStreamEndPoint, externalProxy, cancellationToken);

connection.CacheKey = cacheKey;

Expand All @@ -222,13 +222,14 @@ internal async Task<TcpServerConnection> GetServerConnection(string remoteHostNa
/// <param name="applicationProtocols">The list of HTTPS application level protocol to negotiate if needed.</param>
/// <param name="isConnect">Is this a CONNECT request.</param>
/// <param name="proxyServer">The current ProxyServer instance.</param>
/// <param name="session">The http session.</param>
/// <param name="upStreamEndPoint">The local upstream endpoint to make request via.</param>
/// <param name="externalProxy">The external proxy to make request via.</param>
/// <param name="cancellationToken">The cancellation token for this async task.</param>
/// <returns></returns>
private async Task<TcpServerConnection> createServerConnection(string remoteHostName, int remotePort,
Version httpVersion, bool isHttps, List<SslApplicationProtocol> applicationProtocols, bool isConnect,
ProxyServer proxyServer, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy,
ProxyServer proxyServer, SessionEventArgsBase session, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy,
CancellationToken cancellationToken)
{
//deny connection to proxy end points to avoid infinite connection loop.
Expand Down Expand Up @@ -288,14 +289,14 @@ private async Task<TcpServerConnection> createServerConnection(string remoteHost
var port = useUpstreamProxy ? externalProxy.Port : remotePort;

var ipHostEntry = await Dns.GetHostEntryAsync(hostname);

if (ipHostEntry == null || ipHostEntry.AddressList.Length == 0)
{
throw new Exception($"Could not resolve the hostname {hostname}");
}

session.TimeLine["Dns Resolved"] = DateTime.Now;

var ipAddresses = ipHostEntry.AddressList.OrderBy(x => rnd.Next()).ToArray();


for (int i = 0; i < ipAddresses.Length; i++)
{
Expand All @@ -308,11 +309,13 @@ private async Task<TcpServerConnection> createServerConnection(string remoteHost
{
if (i == ipAddresses.Length - 1)
{
throw new Exception($"Could not resolve the hostname {hostname}", e);
throw new Exception($"Could not establish connection to {hostname}", e);
}
}
}

session.TimeLine["Connection Established"] = DateTime.Now;

await proxyServer.InvokeConnectionCreateEvent(tcpClient, false);

stream = new CustomBufferedStream(tcpClient.GetStream(), proxyServer.BufferPool, proxyServer.BufferSize);
Expand Down Expand Up @@ -368,6 +371,7 @@ private async Task<TcpServerConnection> createServerConnection(string remoteHost
#if NETCOREAPP2_1
negotiatedApplicationProtocol = sslStream.NegotiatedApplicationProtocol;
#endif
session.TimeLine["HTTPS Established"] = DateTime.Now;
}
}
catch (Exception)
Expand Down
4 changes: 1 addition & 3 deletions src/Titanium.Web.Proxy/ProxyServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,6 @@ public ProxyServer(string rootCertificateName, string rootCertificateIssuerName,
bool userTrustRootCertificate = true, bool machineTrustRootCertificate = false,
bool trustRootCertificateAsAdmin = false)
{
// default values
ConnectionTimeOutSeconds = 60;

if (BufferPool == null)
{
Expand Down Expand Up @@ -186,7 +184,7 @@ public ProxyServer(string rootCertificateName, string rootCertificateIssuerName,
/// This will also determine the pool eviction time when connection pool is enabled.
/// Default value is 60 seconds.
/// </summary>
public int ConnectionTimeOutSeconds { get; set; }
public int ConnectionTimeOutSeconds { get; set; } = 60;

/// <summary>
/// Maximum number of concurrent connections per remote host in cache.
Expand Down
4 changes: 3 additions & 1 deletion src/Titanium.Web.Proxy/RequestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ await clientStreamWriter.WriteResponseAsync(args.WebSession.Response,
//for connection pool, retry fails until cache is exhausted.
var result = await retryPolicy<ServerConnectionException>().ExecuteAsync(async (serverConnection) =>
{
args.TimeLine["Server Connection Created"] = DateTime.Now;
args.TimeLine["Connection Ready"] = DateTime.Now;

// if upgrading to websocket then relay the request without reading the contents
if (request.UpgradeToWebSocket)
Expand Down Expand Up @@ -369,6 +369,8 @@ await args.WebSession.SendRequest(Enable100ContinueBehaviour, args.IsTransparent
}
}

args.TimeLine["Request Sent"] = DateTime.Now;

// If not expectation failed response was returned by server then parse response
if (!request.ExpectationFailed)
{
Expand Down
4 changes: 2 additions & 2 deletions src/Titanium.Web.Proxy/TransparentClientHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ private async Task handleClient(TransparentProxyEndPoint endPoint, TcpClientConn
//it could cause floating server connections when client exits
prefetchConnectionTask = tcpConnectionFactory.GetServerConnection(httpsHostName, endPoint.Port,
httpVersion: null, isHttps: true, applicationProtocols: null, isConnect: false,
proxyServer: this, upStreamEndPoint: UpStreamEndPoint, externalProxy: UpStreamHttpsProxy,
proxyServer: this, session: null, upStreamEndPoint: UpStreamEndPoint, externalProxy: UpStreamHttpsProxy,
noCache: false, cancellationToken: CancellationToken.None);
}

Expand Down Expand Up @@ -102,7 +102,7 @@ private async Task handleClient(TransparentProxyEndPoint endPoint, TcpClientConn
{
var connection = await tcpConnectionFactory.GetServerConnection(httpsHostName, endPoint.Port,
httpVersion: null, isHttps: false, applicationProtocols: null,
isConnect: true, proxyServer: this, upStreamEndPoint: UpStreamEndPoint,
isConnect: true, proxyServer: this, session:null, upStreamEndPoint: UpStreamEndPoint,
externalProxy: UpStreamHttpsProxy, noCache: true, cancellationToken: cancellationToken);

try
Expand Down

0 comments on commit 066d430

Please sign in to comment.