mirror of
https://github.com/Radarr/Radarr.git
synced 2026-03-22 17:04:39 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d96dfd228e |
@@ -7,17 +7,21 @@ using System.Net.Sockets;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using NLog;
|
||||||
using NzbDrone.Common.Cache;
|
using NzbDrone.Common.Cache;
|
||||||
using NzbDrone.Common.Extensions;
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http.Proxy;
|
using NzbDrone.Common.Http.Proxy;
|
||||||
|
using NzbDrone.Common.Instrumentation;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Http.Dispatchers
|
namespace NzbDrone.Common.Http.Dispatchers
|
||||||
{
|
{
|
||||||
public class ManagedHttpDispatcher : IHttpDispatcher
|
public class ManagedHttpDispatcher : IHttpDispatcher
|
||||||
{
|
{
|
||||||
private const string NO_PROXY_KEY = "no-proxy";
|
private const string NO_PROXY_KEY = "no-proxy";
|
||||||
|
|
||||||
private const int connection_establish_timeout = 2000;
|
private const int connection_establish_timeout = 2000;
|
||||||
|
|
||||||
|
private static readonly Logger Logger = NzbDroneLogger.GetLogger(typeof(ManagedHttpDispatcher));
|
||||||
|
|
||||||
private static bool useIPv6 = Socket.OSSupportsIPv6;
|
private static bool useIPv6 = Socket.OSSupportsIPv6;
|
||||||
private static bool hasResolvedIPv6Availability;
|
private static bool hasResolvedIPv6Availability;
|
||||||
|
|
||||||
@@ -29,10 +33,10 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
private readonly ICached<CredentialCache> _credentialCache;
|
private readonly ICached<CredentialCache> _credentialCache;
|
||||||
|
|
||||||
public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
|
public ManagedHttpDispatcher(IHttpProxySettingsProvider proxySettingsProvider,
|
||||||
ICreateManagedWebProxy createManagedWebProxy,
|
ICreateManagedWebProxy createManagedWebProxy,
|
||||||
ICertificateValidationService certificateValidationService,
|
ICertificateValidationService certificateValidationService,
|
||||||
IUserAgentBuilder userAgentBuilder,
|
IUserAgentBuilder userAgentBuilder,
|
||||||
ICacheManager cacheManager)
|
ICacheManager cacheManager)
|
||||||
{
|
{
|
||||||
_proxySettingsProvider = proxySettingsProvider;
|
_proxySettingsProvider = proxySettingsProvider;
|
||||||
_createManagedWebProxy = createManagedWebProxy;
|
_createManagedWebProxy = createManagedWebProxy;
|
||||||
@@ -235,16 +239,21 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
|
|
||||||
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
|
private static async ValueTask<Stream> onConnect(SocketsHttpConnectionContext context, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
Logger.Trace($"useIPv6: {useIPv6} hasResolvedipv6availability: {hasResolvedIPv6Availability}");
|
||||||
|
|
||||||
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
|
// Until .NET supports an implementation of Happy Eyeballs (https://tools.ietf.org/html/rfc8305#section-2), let's make IPv4 fallback work in a simple way.
|
||||||
// This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6.
|
// This issue is being tracked at https://github.com/dotnet/runtime/issues/26177 and expected to be fixed in .NET 6.
|
||||||
if (useIPv6)
|
if (useIPv6)
|
||||||
{
|
{
|
||||||
|
Logger.Trace("Trying Ipv6");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var localToken = cancellationToken;
|
var localToken = cancellationToken;
|
||||||
|
|
||||||
if (!hasResolvedIPv6Availability)
|
if (!hasResolvedIPv6Availability)
|
||||||
{
|
{
|
||||||
|
Logger.Trace($"Using fast timeout {connection_establish_timeout}");
|
||||||
|
|
||||||
// to make things move fast, use a very low timeout for the initial ipv6 attempt.
|
// to make things move fast, use a very low timeout for the initial ipv6 attempt.
|
||||||
var quickFailCts = new CancellationTokenSource(connection_establish_timeout);
|
var quickFailCts = new CancellationTokenSource(connection_establish_timeout);
|
||||||
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, quickFailCts.Token);
|
var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, quickFailCts.Token);
|
||||||
@@ -254,8 +263,10 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
|
|
||||||
return await attemptConnection(AddressFamily.InterNetworkV6, context, localToken);
|
return await attemptConnection(AddressFamily.InterNetworkV6, context, localToken);
|
||||||
}
|
}
|
||||||
catch
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
Logger.Trace(e, "Error in ipv6 attempt");
|
||||||
|
|
||||||
// very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt.
|
// very naively fallback to ipv4 permanently for this execution based on the response of the first connection attempt.
|
||||||
// note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance)
|
// note that this may cause users to eventually get switched to ipv4 (on a random failure when they are switching networks, for instance)
|
||||||
// but in the interest of keeping this implementation simple, this is acceptable.
|
// but in the interest of keeping this implementation simple, this is acceptable.
|
||||||
@@ -267,6 +278,8 @@ namespace NzbDrone.Common.Http.Dispatchers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Logger.Trace("Falling back to ipv4");
|
||||||
|
|
||||||
// fallback to IPv4.
|
// fallback to IPv4.
|
||||||
return await attemptConnection(AddressFamily.InterNetwork, context, cancellationToken);
|
return await attemptConnection(AddressFamily.InterNetwork, context, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user