Commit 8e254c99 authored by Jehonathan Thomas's avatar Jehonathan Thomas Committed by GitHub

Merge pull request #209 from danielherken/develop

Added option to bypass external proxy for localhost connections
parents d0fc544f 2253c149
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.Sockets;
namespace Titanium.Web.Proxy.Helpers namespace Titanium.Web.Proxy.Helpers
{ {
internal class NetworkHelper internal class NetworkHelper
...@@ -31,12 +32,49 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -31,12 +32,49 @@ namespace Titanium.Web.Proxy.Helpers
/// </summary> /// </summary>
/// <param name="address"></param> /// <param name="address"></param>
/// <returns></returns> /// <returns></returns>
internal static bool IsLocalIpAddress(IPAddress address) internal static bool IsLocalIpAddress(IPAddress address)
{
// get local IP addresses
var localIPs = Dns.GetHostAddresses(Dns.GetHostName());
// test if any host IP equals to any local IP or to localhost
return IPAddress.IsLoopback(address) || localIPs.Contains(address);
}
internal static bool IsLocalIpAddress(string hostName)
{ {
// get local IP addresses bool isLocalhost = false;
var localIPs = Dns.GetHostAddresses(Dns.GetHostName());
// test if any host IP equals to any local IP or to localhost IPHostEntry localhost = Dns.GetHostEntry("127.0.0.1");
return IPAddress.IsLoopback(address) || localIPs.Contains(address); if (hostName == localhost.HostName)
{
IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
isLocalhost = hostEntry.AddressList.Any(IPAddress.IsLoopback);
}
if (!isLocalhost)
{
localhost = Dns.GetHostEntry(Dns.GetHostName());
IPAddress ipAddress = null;
if (IPAddress.TryParse(hostName, out ipAddress))
isLocalhost = localhost.AddressList.Any(x => x.Equals(ipAddress));
if (!isLocalhost)
{
try
{
var hostEntry = Dns.GetHostEntry(hostName);
isLocalhost = localhost.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals));
}
catch (SocketException)
{
}
}
}
return isLocalhost;
} }
} }
} }
...@@ -18,6 +18,11 @@ namespace Titanium.Web.Proxy.Models ...@@ -18,6 +18,11 @@ namespace Titanium.Web.Proxy.Models
/// </summary> /// </summary>
public bool UseDefaultCredentials { get; set; } public bool UseDefaultCredentials { get; set; }
/// <summary>
/// Bypass this proxy for connections to localhost?
/// </summary>
public bool BypassForLocalhost { get; set; }
/// <summary> /// <summary>
/// Username. /// Username.
/// </summary> /// </summary>
......
...@@ -46,12 +46,17 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -46,12 +46,17 @@ namespace Titanium.Web.Proxy.Network.Tcp
TcpClient client; TcpClient client;
Stream stream; Stream stream;
bool isLocalhost = (externalHttpsProxy == null && externalHttpProxy == null) ? false : NetworkHelper.IsLocalIpAddress(remoteHostName);
bool useHttpsProxy = externalHttpsProxy != null && externalHttpsProxy.HostName != remoteHostName && (externalHttpsProxy.BypassForLocalhost && !isLocalhost);
bool useHttpProxy = externalHttpProxy != null && externalHttpProxy.HostName != remoteHostName && (externalHttpProxy.BypassForLocalhost && !isLocalhost);
if (isHttps) if (isHttps)
{ {
SslStream sslStream = null; SslStream sslStream = null;
//If this proxy uses another external proxy then create a tunnel request for HTTPS connections //If this proxy uses another external proxy then create a tunnel request for HTTPS connections
if (externalHttpsProxy != null && externalHttpsProxy.HostName != remoteHostName) if (useHttpsProxy)
{ {
client = new TcpClient(); client = new TcpClient();
client.Client.Bind(upStreamEndPoint); client.Client.Bind(upStreamEndPoint);
...@@ -113,7 +118,7 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -113,7 +118,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
} }
else else
{ {
if (externalHttpProxy != null && externalHttpProxy.HostName != remoteHostName) if (useHttpProxy)
{ {
client = new TcpClient(); client = new TcpClient();
client.Client.Bind(upStreamEndPoint); client.Client.Bind(upStreamEndPoint);
......
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