From e65aebdcf86fabbbb903a9746921227b3cced62d Mon Sep 17 00:00:00 2001 From: Qstick Date: Sat, 13 Nov 2021 15:13:32 -0600 Subject: [PATCH] New: Use native .NET6 socks proxy Co-Authored-By: ta264 --- .../Http/Proxy/HttpProxySettings.cs | 5 +- .../Http/Proxy/ManagedWebProxyFactory.cs | 69 +++++++------------ src/NzbDrone.Common/Sonarr.Common.csproj | 1 - 3 files changed, 27 insertions(+), 48 deletions(-) diff --git a/src/NzbDrone.Common/Http/Proxy/HttpProxySettings.cs b/src/NzbDrone.Common/Http/Proxy/HttpProxySettings.cs index 58a7541da..46333df0e 100644 --- a/src/NzbDrone.Common/Http/Proxy/HttpProxySettings.cs +++ b/src/NzbDrone.Common/Http/Proxy/HttpProxySettings.cs @@ -1,4 +1,5 @@ -using NzbDrone.Common.Extensions; +using System; +using NzbDrone.Common.Extensions; namespace NzbDrone.Common.Http.Proxy { @@ -41,7 +42,7 @@ namespace NzbDrone.Common.Http.Proxy return hostlist; } - return new string[] { }; + return Array.Empty(); } } diff --git a/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs b/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs index ca58fedee..229bb0dd7 100644 --- a/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs +++ b/src/NzbDrone.Common/Http/Proxy/ManagedWebProxyFactory.cs @@ -1,9 +1,5 @@ using System; -using System.Linq; using System.Net; -using System.Net.Sockets; -using com.LandonKey.SocksWebProxy; -using com.LandonKey.SocksWebProxy.Proxy; using NzbDrone.Common.Cache; using NzbDrone.Common.Extensions; @@ -33,54 +29,37 @@ namespace NzbDrone.Common.Http.Proxy } private IWebProxy CreateWebProxy(HttpProxySettings proxySettings) + { + var uri = GetProxyUri(proxySettings); + + if (uri == null) + { + return null; + } + + if (proxySettings.Username.IsNotNullOrWhiteSpace() && proxySettings.Password.IsNotNullOrWhiteSpace()) + { + return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray, new NetworkCredential(proxySettings.Username, proxySettings.Password)); + } + else + { + return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray); + } + } + + private Uri GetProxyUri(HttpProxySettings proxySettings) { switch (proxySettings.Type) { case ProxyType.Http: - if (proxySettings.Username.IsNotNullOrWhiteSpace() && proxySettings.Password.IsNotNullOrWhiteSpace()) - { - return new WebProxy(proxySettings.Host + ":" + proxySettings.Port, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray, new NetworkCredential(proxySettings.Username, proxySettings.Password)); - } - else - { - return new WebProxy(proxySettings.Host + ":" + proxySettings.Port, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray); - } - + return new Uri("http://" + proxySettings.Host + ":" + proxySettings.Port); case ProxyType.Socks4: - return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Four, proxySettings.Username, proxySettings.Password), false); + return new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port); case ProxyType.Socks5: - return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Five, proxySettings.Username, proxySettings.Password), false); + return new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port); + default: + return null; } - - return null; - } - - private static IPAddress GetProxyIpAddress(string host) - { - IPAddress ipAddress; - if (!IPAddress.TryParse(host, out ipAddress)) - { - try - { - ipAddress = Dns.GetHostEntry(host).AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First(); - } - catch (Exception e) - { - throw new InvalidOperationException(string.Format("Unable to resolve proxy hostname '{0}' to a valid IP address.", host), e); - } - } - - return ipAddress; - } - - private static int GetNextFreePort() - { - var listener = new TcpListener(IPAddress.Loopback, 0); - listener.Start(); - var port = ((IPEndPoint)listener.LocalEndpoint).Port; - listener.Stop(); - - return port; } } } diff --git a/src/NzbDrone.Common/Sonarr.Common.csproj b/src/NzbDrone.Common/Sonarr.Common.csproj index 89ebdb588..1cc78b3e5 100644 --- a/src/NzbDrone.Common/Sonarr.Common.csproj +++ b/src/NzbDrone.Common/Sonarr.Common.csproj @@ -6,7 +6,6 @@ -