Lidarr/src/NzbDrone.Core/Http/HttpProxySettingsProvider.cs
Bogdan df09e903d4 New: Bypass IP addresses ranges in proxies
(cherry picked from commit 402db9128c214d4c5af6583643cb49d3aa7a28b5)
2024-08-26 04:17:46 +03:00

68 lines
2.3 KiB
C#

using System;
using System.Linq;
using System.Net;
using NetTools;
using NzbDrone.Common.Http;
using NzbDrone.Common.Http.Proxy;
using NzbDrone.Core.Configuration;
namespace NzbDrone.Core.Http
{
public class HttpProxySettingsProvider : IHttpProxySettingsProvider
{
private readonly IConfigService _configService;
public HttpProxySettingsProvider(IConfigService configService)
{
_configService = configService;
}
public HttpProxySettings GetProxySettings(HttpUri uri)
{
var proxySettings = GetProxySettings();
if (proxySettings == null)
{
return null;
}
if (ShouldProxyBeBypassed(proxySettings, uri))
{
return null;
}
return proxySettings;
}
public HttpProxySettings GetProxySettings()
{
if (!_configService.ProxyEnabled)
{
return null;
}
return new HttpProxySettings(_configService.ProxyType,
_configService.ProxyHostname,
_configService.ProxyPort,
_configService.ProxyBypassFilter,
_configService.ProxyBypassLocalAddresses,
_configService.ProxyUsername,
_configService.ProxyPassword);
}
public bool ShouldProxyBeBypassed(HttpProxySettings proxySettings, HttpUri url)
{
// We are utilizing the WebProxy implementation here to save us having to re-implement it. This way we use Microsofts implementation
var proxy = new WebProxy(proxySettings.Host + ":" + proxySettings.Port, proxySettings.BypassLocalAddress, proxySettings.BypassListAsArray);
return proxy.IsBypassed((Uri)url) || IsBypassedByIpAddressRange(proxySettings.BypassListAsArray, url.Host);
}
private static bool IsBypassedByIpAddressRange(string[] bypassList, string host)
{
return bypassList.Any(bypass =>
IPAddressRange.TryParse(bypass, out var ipAddressRange) &&
IPAddress.TryParse(host, out var ipAddress) &&
ipAddressRange.Contains(ipAddress));
}
}
}