diff --git a/FastGithub.DomainResolve/DomainResolver.cs b/FastGithub.DomainResolve/DomainResolver.cs index a1146e9..ea7be8a 100644 --- a/FastGithub.DomainResolve/DomainResolver.cs +++ b/FastGithub.DomainResolve/DomainResolver.cs @@ -20,8 +20,8 @@ namespace FastGithub.DomainResolve /// sealed class DomainResolver : IDomainResolver { - private readonly IMemoryCache blackIPAddressCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); private readonly IMemoryCache domainResolveCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); + private readonly IMemoryCache disableIPAddressCache = new MemoryCache(Options.Create(new MemoryCacheOptions())); private readonly FastGithubConfig fastGithubConfig; private readonly DnscryptProxy dnscryptProxy; @@ -51,13 +51,13 @@ namespace FastGithub.DomainResolve } /// - /// 设置ip黑名单 + /// 设置ip不可用 /// /// ip /// 过期时间 - public void SetBlack(IPAddress address, TimeSpan expiration) + public void SetDisabled(IPAddress address, TimeSpan expiration) { - this.blackIPAddressCache.Set(address, address, expiration); + this.disableIPAddressCache.Set(address, address, expiration); } /// @@ -165,6 +165,7 @@ namespace FastGithub.DomainResolve using var timeoutTokenSource = new CancellationTokenSource(this.lookupTimeout); using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token); var addresses = await dnsClient.Lookup(domain.Host, RecordType.A, linkedTokenSource.Token); + addresses = addresses.Where(address => this.disableIPAddressCache.TryGetValue(address, out _) == false).ToList(); return await this.FindFastValueAsync(addresses, domain.Port, cancellationToken); } catch (Exception ex) @@ -189,6 +190,11 @@ namespace FastGithub.DomainResolve return default; } + if (port <= 0) + { + return addresses.FirstOrDefault(); + } + var tasks = addresses.Select(address => this.IsAvailableAsync(address, port, cancellationToken)); var fastTask = await Task.WhenAny(tasks); return await fastTask; @@ -204,16 +210,6 @@ namespace FastGithub.DomainResolve /// private async Task IsAvailableAsync(IPAddress address, int port, CancellationToken cancellationToken) { - if (port <= 0) - { - return address; - } - - if (this.blackIPAddressCache.TryGetValue(address, out _)) - { - return default; - } - try { using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); @@ -224,12 +220,12 @@ namespace FastGithub.DomainResolve } catch (OperationCanceledException) { - this.SetBlack(address, TimeSpan.FromSeconds(10d)); + this.SetDisabled(address, TimeSpan.FromMilliseconds(1d)); return default; } catch (Exception) { - this.SetBlack(address, TimeSpan.FromSeconds(10d)); + this.SetDisabled(address, TimeSpan.FromMilliseconds(1d)); await Task.Delay(this.connectTimeout, cancellationToken); return default; } diff --git a/FastGithub.DomainResolve/IDomainResolver.cs b/FastGithub.DomainResolve/IDomainResolver.cs index 505a031..b967a29 100644 --- a/FastGithub.DomainResolve/IDomainResolver.cs +++ b/FastGithub.DomainResolve/IDomainResolver.cs @@ -11,11 +11,11 @@ namespace FastGithub.DomainResolve public interface IDomainResolver { /// - /// 设置ip黑名单 + /// 设置ip不可用 /// /// ip /// 过期时间 - void SetBlack(IPAddress address, TimeSpan expiration); + void SetDisabled(IPAddress address, TimeSpan expiration); /// /// 刷新域名解析结果 diff --git a/FastGithub.Http/HttpClientHandler.cs b/FastGithub.Http/HttpClientHandler.cs index c3c1585..b4a8b02 100644 --- a/FastGithub.Http/HttpClientHandler.cs +++ b/FastGithub.Http/HttpClientHandler.cs @@ -135,7 +135,7 @@ namespace FastGithub.Http if (IPAddress.TryParse(request.RequestUri.Host, out var address)) { - this.domainResolver.SetBlack(address, this.blackIPAddressExpiration); + this.domainResolver.SetDisabled(address, this.blackIPAddressExpiration); } if (request.Headers.Host != null)