From 8cc28f5f47f11161eeb878300bb30a6d03816bc2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=80=81=E4=B9=9D?= <366193849@qq.com>
Date: Sun, 29 Aug 2021 22:48:58 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E9=99=A4=E4=B8=8D=E5=8F=AF=E7=94=A8?=
=?UTF-8?q?=E7=9A=84ip?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FastGithub.DomainResolve/DomainResolver.cs | 28 +++++++++------------
FastGithub.DomainResolve/IDomainResolver.cs | 4 +--
FastGithub.Http/HttpClientHandler.cs | 2 +-
3 files changed, 15 insertions(+), 19 deletions(-)
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)