Unverified Commit 8cbf0f43 authored by honfika's avatar honfika Committed by GitHub

Merge pull request #710 from justcoding121/master

beta
parents 312dca6c d21ea354
...@@ -207,6 +207,17 @@ namespace Titanium.Web.Proxy.Examples.Basic ...@@ -207,6 +207,17 @@ namespace Titanium.Web.Proxy.Examples.Basic
{ {
e.GetState().PipelineInfo.AppendLine(nameof(onRequest) + ":" + e.HttpClient.Request.RequestUri); e.GetState().PipelineInfo.AppendLine(nameof(onRequest) + ":" + e.HttpClient.Request.RequestUri);
var clientLocalIp = e.ClientLocalEndPoint.Address;
if (!clientLocalIp.Equals(IPAddress.Loopback) && !clientLocalIp.Equals(IPAddress.IPv6Loopback))
{
e.HttpClient.UpStreamEndPoint = new IPEndPoint(clientLocalIp, 0);
}
if (e.HttpClient.Request.Url.Contains("yahoo.com"))
{
e.CustomUpStreamProxy = new ExternalProxy("localhost", 8888);
}
await writeToConsole("Active Client Connections:" + ((ProxyServer)sender).ClientConnectionCount); await writeToConsole("Active Client Connections:" + ((ProxyServer)sender).ClientConnectionCount);
await writeToConsole(e.HttpClient.Request.Url); await writeToConsole(e.HttpClient.Request.Url);
......
...@@ -59,7 +59,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -59,7 +59,7 @@ namespace Titanium.Web.Proxy.EventArguments
ClientStream = clientStream; ClientStream = clientStream;
HttpClient = new HttpWebClient(connectRequest, request, new Lazy<int>(() => clientStream.Connection.GetProcessId(endPoint))); HttpClient = new HttpWebClient(connectRequest, request, new Lazy<int>(() => clientStream.Connection.GetProcessId(endPoint)));
LocalEndPoint = endPoint; ProxyEndPoint = endPoint;
EnableWinAuth = server.EnableWinAuth && isWindowsAuthenticationSupported; EnableWinAuth = server.EnableWinAuth && isWindowsAuthenticationSupported;
} }
...@@ -103,6 +103,9 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -103,6 +103,9 @@ namespace Titanium.Web.Proxy.EventArguments
/// </summary> /// </summary>
public IPEndPoint ClientRemoteEndPoint => (IPEndPoint)ClientConnection.RemoteEndPoint; public IPEndPoint ClientRemoteEndPoint => (IPEndPoint)ClientConnection.RemoteEndPoint;
[Obsolete("Use ClientRemoteEndPoint instead.")]
public IPEndPoint ClientEndPoint => ClientRemoteEndPoint;
/// <summary> /// <summary>
/// The web client used to communicate with server for this session. /// The web client used to communicate with server for this session.
/// </summary> /// </summary>
...@@ -111,6 +114,14 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -111,6 +114,14 @@ namespace Titanium.Web.Proxy.EventArguments
[Obsolete("Use HttpClient instead.")] [Obsolete("Use HttpClient instead.")]
public HttpWebClient WebSession => HttpClient; public HttpWebClient WebSession => HttpClient;
/// <summary>
/// Gets or sets the custom up stream proxy.
/// </summary>
/// <value>
/// The custom up stream proxy.
/// </value>
public IExternalProxy? CustomUpStreamProxy { get; set; }
/// <summary> /// <summary>
/// Are we using a custom upstream HTTP(S) proxy? /// Are we using a custom upstream HTTP(S) proxy?
/// </summary> /// </summary>
...@@ -119,12 +130,15 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -119,12 +130,15 @@ namespace Titanium.Web.Proxy.EventArguments
/// <summary> /// <summary>
/// Local endpoint via which we make the request. /// Local endpoint via which we make the request.
/// </summary> /// </summary>
public ProxyEndPoint LocalEndPoint { get; } public ProxyEndPoint ProxyEndPoint { get; }
[Obsolete("Use ProxyEndPoint instead.")]
public ProxyEndPoint LocalEndPoint => ProxyEndPoint;
/// <summary> /// <summary>
/// Is this a transparent endpoint? /// Is this a transparent endpoint?
/// </summary> /// </summary>
public bool IsTransparent => LocalEndPoint is TransparentProxyEndPoint; public bool IsTransparent => ProxyEndPoint is TransparentProxyEndPoint;
/// <summary> /// <summary>
/// The last exception that happened. /// The last exception that happened.
......
...@@ -114,11 +114,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp ...@@ -114,11 +114,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp
} }
// TODO: Apply authorization // TODO: Apply authorization
var systemProxy = new ExternalProxy var systemProxy = new ExternalProxy(proxyStr, port);
{
HostName = proxyStr,
Port = port
};
return systemProxy; return systemProxy;
} }
...@@ -134,12 +130,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp ...@@ -134,12 +130,7 @@ namespace Titanium.Web.Proxy.Helpers.WinHttp
HttpSystemProxyValue? value = null; HttpSystemProxyValue? value = null;
if (ProxyInfo?.Proxies?.TryGetValue(protocolType.Value, out value) == true) if (ProxyInfo?.Proxies?.TryGetValue(protocolType.Value, out value) == true)
{ {
var systemProxy = new ExternalProxy var systemProxy = new ExternalProxy(value!.HostName, value.Port);
{
HostName = value!.HostName,
Port = value.Port
};
return systemProxy; return systemProxy;
} }
} }
......
...@@ -69,6 +69,39 @@ namespace Titanium.Web.Proxy.Models ...@@ -69,6 +69,39 @@ namespace Titanium.Web.Proxy.Models
/// </summary> /// </summary>
public int Port { get; set; } public int Port { get; set; }
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
public ExternalProxy()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
/// <param name="hostName">Name of the host.</param>
/// <param name="port">The port.</param>
public ExternalProxy(string hostName, int port)
{
HostName = hostName;
Port = port;
}
/// <summary>
/// Initializes a new instance of the <see cref="ExternalProxy"/> class.
/// </summary>
/// <param name="hostName">Name of the host.</param>
/// <param name="port">The port.</param>
/// <param name="userName">Name of the user.</param>
/// <param name="password">The password.</param>
public ExternalProxy(string hostName, int port, string userName, string password)
{
HostName = hostName;
Port = port;
UserName = userName;
Password = password;
}
/// <summary> /// <summary>
/// returns data in Hostname:port format. /// returns data in Hostname:port format.
/// </summary> /// </summary>
...@@ -77,6 +110,5 @@ namespace Titanium.Web.Proxy.Models ...@@ -77,6 +110,5 @@ namespace Titanium.Web.Proxy.Models
{ {
return $"{HostName}:{Port}"; return $"{HostName}:{Port}";
} }
} }
} }
...@@ -114,10 +114,10 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -114,10 +114,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
applicationProtocols = new List<SslApplicationProtocol> { applicationProtocol }; applicationProtocols = new List<SslApplicationProtocol> { applicationProtocol };
} }
IExternalProxy? customUpStreamProxy = null; IExternalProxy? customUpStreamProxy = session.CustomUpStreamProxy;
bool isHttps = session.IsHttps; bool isHttps = session.IsHttps;
if (server.GetCustomUpStreamProxyFunc != null) if (customUpStreamProxy == null && server.GetCustomUpStreamProxyFunc != null)
{ {
customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(session); customUpStreamProxy = await server.GetCustomUpStreamProxyFunc(session);
} }
...@@ -169,10 +169,10 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -169,10 +169,10 @@ namespace Titanium.Web.Proxy.Network.Tcp
internal async Task<TcpServerConnection> GetServerConnection(ProxyServer proxyServer, SessionEventArgsBase session, bool isConnect, internal async Task<TcpServerConnection> GetServerConnection(ProxyServer proxyServer, SessionEventArgsBase session, bool isConnect,
List<SslApplicationProtocol>? applicationProtocols, bool noCache, CancellationToken cancellationToken) List<SslApplicationProtocol>? applicationProtocols, bool noCache, CancellationToken cancellationToken)
{ {
IExternalProxy? customUpStreamProxy = null; IExternalProxy? customUpStreamProxy = session.CustomUpStreamProxy;
bool isHttps = session.IsHttps; bool isHttps = session.IsHttps;
if (proxyServer.GetCustomUpStreamProxyFunc != null) if (customUpStreamProxy == null && proxyServer.GetCustomUpStreamProxyFunc != null)
{ {
customUpStreamProxy = await proxyServer.GetCustomUpStreamProxyFunc(session); customUpStreamProxy = await proxyServer.GetCustomUpStreamProxyFunc(session);
} }
......
...@@ -175,7 +175,7 @@ namespace Titanium.Web.Proxy ...@@ -175,7 +175,7 @@ namespace Titanium.Web.Proxy
// Add custom div to body to clarify that the proxy (not the client browser) failed authentication // Add custom div to body to clarify that the proxy (not the client browser) failed authentication
string authErrorMessage = string authErrorMessage =
"<div class=\"inserted-by-proxy\"><h2>NTLM authentication through Titanium.Web.Proxy (" + "<div class=\"inserted-by-proxy\"><h2>NTLM authentication through Titanium.Web.Proxy (" +
args.ClientConnection.LocalEndPoint + args.ClientLocalEndPoint +
") failed. Please check credentials.</h2></div>"; ") failed. Please check credentials.</h2></div>";
string originalErrorMessage = string originalErrorMessage =
"<div class=\"inserted-by-proxy\"><h3>Response from remote web server below.</h3></div><br/>"; "<div class=\"inserted-by-proxy\"><h3>Response from remote web server below.</h3></div><br/>";
......
...@@ -59,11 +59,7 @@ namespace Titanium.Web.Proxy.IntegrationTests ...@@ -59,11 +59,7 @@ namespace Titanium.Web.Proxy.IntegrationTests
{ {
Assert.AreEqual("Test", session.UserData); Assert.AreEqual("Test", session.UserData);
return await Task.FromResult(new Models.ExternalProxy return await Task.FromResult(new Models.ExternalProxy("localhost", proxy2.ProxyEndPoints[0].Port));
{
HostName = "localhost",
Port = proxy2.ProxyEndPoints[0].Port
});
}; };
var client = testSuite.GetClient(proxy1, true); var client = testSuite.GetClient(proxy1, true);
......
...@@ -22,17 +22,8 @@ namespace Titanium.Web.Proxy.IntegrationTests.Setup ...@@ -22,17 +22,8 @@ namespace Titanium.Web.Proxy.IntegrationTests.Setup
if (upStreamProxy != null) if (upStreamProxy != null)
{ {
ProxyServer.UpStreamHttpProxy = new ExternalProxy ProxyServer.UpStreamHttpProxy = new ExternalProxy("localhost", upStreamProxy.ProxyEndPoints[0].Port);
{ ProxyServer.UpStreamHttpsProxy = new ExternalProxy("localhost", upStreamProxy.ProxyEndPoints[0].Port);
HostName = "localhost",
Port = upStreamProxy.ProxyEndPoints[0].Port
};
ProxyServer.UpStreamHttpsProxy = new ExternalProxy
{
HostName = "localhost",
Port = upStreamProxy.ProxyEndPoints[0].Port
};
} }
ProxyServer.Start(); ProxyServer.Start();
......
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