Unverified Commit c6150bf9 authored by honfika's avatar honfika Committed by GitHub

Merge pull request #650 from justcoding121/master

beta
parents 43e2988d 16cccdc5
...@@ -22,7 +22,7 @@ namespace Titanium.Web.Proxy.EventArguments ...@@ -22,7 +22,7 @@ namespace Titanium.Web.Proxy.EventArguments
{ {
private static bool isWindowsAuthenticationSupported => RunTime.IsWindows; private static bool isWindowsAuthenticationSupported => RunTime.IsWindows;
internal readonly CancellationTokenSource CancellationTokenSource; internal readonly CancellationTokenSource? CancellationTokenSource;
internal TcpServerConnection ServerConnection => HttpClient.Connection; internal TcpServerConnection ServerConnection => HttpClient.Connection;
......
using System; using System;
using System.Reflection;
using System.Text; using System.Text;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning;
namespace Titanium.Web.Proxy.Helpers namespace Titanium.Web.Proxy.Helpers
{ {
...@@ -41,6 +43,62 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -41,6 +43,62 @@ namespace Titanium.Web.Proxy.Helpers
public static bool IsUwpOnWindows => IsWindows && UwpHelper.IsRunningAsUwp(); public static bool IsUwpOnWindows => IsWindows && UwpHelper.IsRunningAsUwp();
public static bool IsMac => isRunningOnMac; public static bool IsMac => isRunningOnMac;
/// <summary>
/// Is socket reuse available to use?
/// </summary>
public static bool IsSocketReuseAvailable => isSocketReuseAvailable();
private static bool? _isSocketReuseAvailable;
private static bool isSocketReuseAvailable()
{
// use the cached value if we have one
if (_isSocketReuseAvailable != null)
return _isSocketReuseAvailable.Value;
try
{
if (IsWindows)
{
// since we are on windows just return true
// store the result in our static object so we don't have to be bothered going through all this more than once
_isSocketReuseAvailable = true;
return true;
}
// get the currently running framework name and version (EX: .NETFramework,Version=v4.5.1) (Ex: .NETCoreApp,Version=v2.0)
string ver = Assembly.GetEntryAssembly()?.GetCustomAttribute<TargetFrameworkAttribute>()?.FrameworkName;
if (ver == null)
return false; // play it safe if we can not figure out what the framework is
// make sure we are on .NETCoreApp
ver = ver.ToLower(); // make everything lowercase to simplify comparison
if (ver.Contains(".netcoreapp"))
{
var versionString = ver.Replace(".netcoreapp,version=v", "");
var versionArr = versionString.Split('.');
var majorVersion = Convert.ToInt32(versionArr[0]);
var result = majorVersion >= 3; // version 3 and up supports socket reuse
// store the result in our static object so we don't have to be bothered going through all this more than once
_isSocketReuseAvailable = result;
return result;
}
// store the result in our static object so we don't have to be bothered going through all this more than once
_isSocketReuseAvailable = false;
return false;
}
catch
{
// store the result in our static object so we don't have to be bothered going through all this more than once
_isSocketReuseAvailable = false;
return false;
}
}
// https://github.com/qmatteoq/DesktopBridgeHelpers/blob/master/DesktopBridge.Helpers/Helpers.cs // https://github.com/qmatteoq/DesktopBridgeHelpers/blob/master/DesktopBridge.Helpers/Helpers.cs
private class UwpHelper private class UwpHelper
......
...@@ -315,8 +315,7 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -315,8 +315,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
tcpClient.SendTimeout = proxyServer.ConnectionTimeOutSeconds * 1000; tcpClient.SendTimeout = proxyServer.ConnectionTimeOutSeconds * 1000;
tcpClient.LingerState = new LingerOption(true, proxyServer.TcpTimeWaitSeconds); tcpClient.LingerState = new LingerOption(true, proxyServer.TcpTimeWaitSeconds);
// linux has a bug with socket reuse in .net core. if (proxyServer.ReuseSocket && RunTime.IsSocketReuseAvailable)
if (proxyServer.ReuseSocket && RunTime.IsWindows)
{ {
tcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); tcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
} }
...@@ -417,7 +416,7 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -417,7 +416,7 @@ namespace Titanium.Web.Proxy.Network.Tcp
throw; throw;
} }
return new TcpServerConnection(proxyServer, tcpClient) return new TcpServerConnection(proxyServer, tcpClient, stream)
{ {
UpStreamProxy = externalProxy, UpStreamProxy = externalProxy,
UpStreamEndPoint = upStreamEndPoint, UpStreamEndPoint = upStreamEndPoint,
...@@ -426,8 +425,6 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -426,8 +425,6 @@ namespace Titanium.Web.Proxy.Network.Tcp
IsHttps = isHttps, IsHttps = isHttps,
NegotiatedApplicationProtocol = negotiatedApplicationProtocol, NegotiatedApplicationProtocol = negotiatedApplicationProtocol,
UseUpstreamProxy = useUpstreamProxy, UseUpstreamProxy = useUpstreamProxy,
StreamWriter = new HttpRequestWriter(stream, proxyServer.BufferPool),
Stream = stream,
Version = httpVersion Version = httpVersion
}; };
} }
......
...@@ -15,12 +15,14 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -15,12 +15,14 @@ namespace Titanium.Web.Proxy.Network.Tcp
/// </summary> /// </summary>
internal class TcpServerConnection : IDisposable internal class TcpServerConnection : IDisposable
{ {
internal TcpServerConnection(ProxyServer proxyServer, TcpClient tcpClient) internal TcpServerConnection(ProxyServer proxyServer, TcpClient tcpClient, CustomBufferedStream stream)
{ {
this.tcpClient = tcpClient; this.tcpClient = tcpClient;
LastAccess = DateTime.Now; LastAccess = DateTime.Now;
this.proxyServer = proxyServer; this.proxyServer = proxyServer;
this.proxyServer.UpdateServerConnectionCount(true); this.proxyServer.UpdateServerConnectionCount(true);
StreamWriter = new HttpRequestWriter(stream, proxyServer.BufferPool);
Stream = stream;
} }
private ProxyServer proxyServer { get; } private ProxyServer proxyServer { get; }
...@@ -59,12 +61,12 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -59,12 +61,12 @@ namespace Titanium.Web.Proxy.Network.Tcp
/// <summary> /// <summary>
/// Used to write lines to server /// Used to write lines to server
/// </summary> /// </summary>
internal HttpRequestWriter? StreamWriter { get; set; } internal HttpRequestWriter StreamWriter { get; }
/// <summary> /// <summary>
/// Server stream /// Server stream
/// </summary> /// </summary>
internal CustomBufferedStream? Stream { get; set; } internal CustomBufferedStream Stream { get; }
/// <summary> /// <summary>
/// Last time this connection was used /// Last time this connection was used
......
...@@ -55,7 +55,7 @@ namespace Titanium.Web.Proxy ...@@ -55,7 +55,7 @@ namespace Titanium.Web.Proxy
/// <summary> /// <summary>
/// Upstream proxy manager. /// Upstream proxy manager.
/// </summary> /// </summary>
private WinHttpWebProxyFinder systemProxyResolver; private WinHttpWebProxyFinder? systemProxyResolver;
/// <inheritdoc /> /// <inheritdoc />
...@@ -421,7 +421,7 @@ namespace Titanium.Web.Proxy ...@@ -421,7 +421,7 @@ namespace Titanium.Web.Proxy
/// <param name="protocolType">The proxy protocol type.</param> /// <param name="protocolType">The proxy protocol type.</param>
public void SetAsSystemProxy(ExplicitProxyEndPoint endPoint, ProxyProtocolType protocolType) public void SetAsSystemProxy(ExplicitProxyEndPoint endPoint, ProxyProtocolType protocolType)
{ {
if (!RunTime.IsWindows) if (systemProxySettingsManager == null)
{ {
throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows. throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows.
Please manually confugure you operating system to use this proxy's port and address."); Please manually confugure you operating system to use this proxy's port and address.");
...@@ -515,7 +515,7 @@ namespace Titanium.Web.Proxy ...@@ -515,7 +515,7 @@ namespace Titanium.Web.Proxy
/// </summary> /// </summary>
public void RestoreOriginalProxySettings() public void RestoreOriginalProxySettings()
{ {
if (!RunTime.IsWindows) if (systemProxySettingsManager == null)
{ {
throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows. throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows.
Please manually configure your operating system to use this proxy's port and address."); Please manually configure your operating system to use this proxy's port and address.");
...@@ -529,7 +529,7 @@ namespace Titanium.Web.Proxy ...@@ -529,7 +529,7 @@ namespace Titanium.Web.Proxy
/// </summary> /// </summary>
public void DisableSystemProxy(ProxyProtocolType protocolType) public void DisableSystemProxy(ProxyProtocolType protocolType)
{ {
if (!RunTime.IsWindows) if (systemProxySettingsManager == null)
{ {
throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows. throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows.
Please manually configure your operating system to use this proxy's port and address."); Please manually configure your operating system to use this proxy's port and address.");
...@@ -543,7 +543,7 @@ namespace Titanium.Web.Proxy ...@@ -543,7 +543,7 @@ namespace Titanium.Web.Proxy
/// </summary> /// </summary>
public void DisableAllSystemProxies() public void DisableAllSystemProxies()
{ {
if (!RunTime.IsWindows) if (systemProxySettingsManager == null)
{ {
throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows. throw new NotSupportedException(@"Setting system proxy settings are only supported in Windows.
Please manually confugure you operating system to use this proxy's port and address."); Please manually confugure you operating system to use this proxy's port and address.");
...@@ -622,7 +622,7 @@ namespace Titanium.Web.Proxy ...@@ -622,7 +622,7 @@ namespace Titanium.Web.Proxy
throw new Exception("Proxy is not running."); throw new Exception("Proxy is not running.");
} }
if (RunTime.IsWindows && !RunTime.IsUwpOnWindows) if (systemProxySettingsManager != null)
{ {
bool setAsSystemProxy = ProxyEndPoints.OfType<ExplicitProxyEndPoint>() bool setAsSystemProxy = ProxyEndPoints.OfType<ExplicitProxyEndPoint>()
.Any(x => x.IsSystemHttpProxy || x.IsSystemHttpsProxy); .Any(x => x.IsSystemHttpProxy || x.IsSystemHttpsProxy);
...@@ -654,8 +654,7 @@ namespace Titanium.Web.Proxy ...@@ -654,8 +654,7 @@ namespace Titanium.Web.Proxy
{ {
endPoint.Listener = new TcpListener(endPoint.IpAddress, endPoint.Port); endPoint.Listener = new TcpListener(endPoint.IpAddress, endPoint.Port);
// linux/macOS has a bug with socket reuse in .net core. if (ReuseSocket && RunTime.IsSocketReuseAvailable)
if (ReuseSocket && RunTime.IsWindows)
{ {
endPoint.Listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); endPoint.Listener.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
} }
......
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