New: Use native .NET6 socks proxy

Co-Authored-By: ta264 <ta264@users.noreply.github.com>
This commit is contained in:
Qstick 2021-11-13 15:13:32 -06:00 committed by Mark McDowall
parent 4c0fe62dda
commit e65aebdcf8
3 changed files with 27 additions and 48 deletions

View File

@ -1,4 +1,5 @@
using NzbDrone.Common.Extensions; using System;
using NzbDrone.Common.Extensions;
namespace NzbDrone.Common.Http.Proxy namespace NzbDrone.Common.Http.Proxy
{ {
@ -41,7 +42,7 @@ namespace NzbDrone.Common.Http.Proxy
return hostlist; return hostlist;
} }
return new string[] { }; return Array.Empty<string>();
} }
} }

View File

@ -1,9 +1,5 @@
using System; using System;
using System.Linq;
using System.Net; using System.Net;
using System.Net.Sockets;
using com.LandonKey.SocksWebProxy;
using com.LandonKey.SocksWebProxy.Proxy;
using NzbDrone.Common.Cache; using NzbDrone.Common.Cache;
using NzbDrone.Common.Extensions; using NzbDrone.Common.Extensions;
@ -34,53 +30,36 @@ namespace NzbDrone.Common.Http.Proxy
private IWebProxy CreateWebProxy(HttpProxySettings proxySettings) private IWebProxy CreateWebProxy(HttpProxySettings proxySettings)
{ {
switch (proxySettings.Type) var uri = GetProxyUri(proxySettings);
{
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);
}
case ProxyType.Socks4:
return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Four, proxySettings.Username, proxySettings.Password), false);
case ProxyType.Socks5:
return new SocksWebProxy(new ProxyConfig(IPAddress.Loopback, GetNextFreePort(), GetProxyIpAddress(proxySettings.Host), proxySettings.Port, ProxyConfig.SocksVersion.Five, proxySettings.Username, proxySettings.Password), false);
}
if (uri == null)
{
return null; return null;
} }
private static IPAddress GetProxyIpAddress(string host) if (proxySettings.Username.IsNotNullOrWhiteSpace() && proxySettings.Password.IsNotNullOrWhiteSpace())
{ {
IPAddress ipAddress; return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray, new NetworkCredential(proxySettings.Username, proxySettings.Password));
if (!IPAddress.TryParse(host, out ipAddress))
{
try
{
ipAddress = Dns.GetHostEntry(host).AddressList.OrderByDescending(a => a.AddressFamily == AddressFamily.InterNetwork).First();
} }
catch (Exception e) else
{ {
throw new InvalidOperationException(string.Format("Unable to resolve proxy hostname '{0}' to a valid IP address.", host), e); return new WebProxy(uri, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray);
} }
} }
return ipAddress; private Uri GetProxyUri(HttpProxySettings proxySettings)
}
private static int GetNextFreePort()
{ {
var listener = new TcpListener(IPAddress.Loopback, 0); switch (proxySettings.Type)
listener.Start(); {
var port = ((IPEndPoint)listener.LocalEndpoint).Port; case ProxyType.Http:
listener.Stop(); return new Uri("http://" + proxySettings.Host + ":" + proxySettings.Port);
case ProxyType.Socks4:
return port; return new Uri("socks4://" + proxySettings.Host + ":" + proxySettings.Port);
case ProxyType.Socks5:
return new Uri("socks5://" + proxySettings.Host + ":" + proxySettings.Port);
default:
return null;
}
} }
} }
} }

View File

@ -6,7 +6,6 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="DryIoc.dll" Version="4.8.6" /> <PackageReference Include="DryIoc.dll" Version="4.8.6" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" /> <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="DotNet4.SocksProxy" Version="1.4.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NLog" Version="4.7.14" /> <PackageReference Include="NLog" Version="4.7.14" />
<PackageReference Include="NLog.Targets.Syslog" Version="6.0.3" /> <PackageReference Include="NLog.Targets.Syslog" Version="6.0.3" />