排除不可用的ip

This commit is contained in:
老九 2021-08-29 22:48:58 +08:00
parent 21dc7dc371
commit 8cc28f5f47
3 changed files with 15 additions and 19 deletions

View File

@ -20,8 +20,8 @@ namespace FastGithub.DomainResolve
/// </summary> /// </summary>
sealed class DomainResolver : IDomainResolver 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 domainResolveCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
private readonly IMemoryCache disableIPAddressCache = new MemoryCache(Options.Create(new MemoryCacheOptions()));
private readonly FastGithubConfig fastGithubConfig; private readonly FastGithubConfig fastGithubConfig;
private readonly DnscryptProxy dnscryptProxy; private readonly DnscryptProxy dnscryptProxy;
@ -51,13 +51,13 @@ namespace FastGithub.DomainResolve
} }
/// <summary> /// <summary>
/// 设置ip黑名单 /// 设置ip不可用
/// </summary> /// </summary>
/// <param name="address">ip</param> /// <param name="address">ip</param>
/// <param name="expiration">过期时间</param> /// <param name="expiration">过期时间</param>
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);
} }
/// <summary> /// <summary>
@ -165,6 +165,7 @@ namespace FastGithub.DomainResolve
using var timeoutTokenSource = new CancellationTokenSource(this.lookupTimeout); using var timeoutTokenSource = new CancellationTokenSource(this.lookupTimeout);
using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token); using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutTokenSource.Token);
var addresses = await dnsClient.Lookup(domain.Host, RecordType.A, linkedTokenSource.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); return await this.FindFastValueAsync(addresses, domain.Port, cancellationToken);
} }
catch (Exception ex) catch (Exception ex)
@ -189,6 +190,11 @@ namespace FastGithub.DomainResolve
return default; return default;
} }
if (port <= 0)
{
return addresses.FirstOrDefault();
}
var tasks = addresses.Select(address => this.IsAvailableAsync(address, port, cancellationToken)); var tasks = addresses.Select(address => this.IsAvailableAsync(address, port, cancellationToken));
var fastTask = await Task.WhenAny(tasks); var fastTask = await Task.WhenAny(tasks);
return await fastTask; return await fastTask;
@ -204,16 +210,6 @@ namespace FastGithub.DomainResolve
/// <returns></returns> /// <returns></returns>
private async Task<IPAddress?> IsAvailableAsync(IPAddress address, int port, CancellationToken cancellationToken) private async Task<IPAddress?> IsAvailableAsync(IPAddress address, int port, CancellationToken cancellationToken)
{ {
if (port <= 0)
{
return address;
}
if (this.blackIPAddressCache.TryGetValue(address, out _))
{
return default;
}
try try
{ {
using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp); using var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);
@ -224,12 +220,12 @@ namespace FastGithub.DomainResolve
} }
catch (OperationCanceledException) catch (OperationCanceledException)
{ {
this.SetBlack(address, TimeSpan.FromSeconds(10d)); this.SetDisabled(address, TimeSpan.FromMilliseconds(1d));
return default; return default;
} }
catch (Exception) catch (Exception)
{ {
this.SetBlack(address, TimeSpan.FromSeconds(10d)); this.SetDisabled(address, TimeSpan.FromMilliseconds(1d));
await Task.Delay(this.connectTimeout, cancellationToken); await Task.Delay(this.connectTimeout, cancellationToken);
return default; return default;
} }

View File

@ -11,11 +11,11 @@ namespace FastGithub.DomainResolve
public interface IDomainResolver public interface IDomainResolver
{ {
/// <summary> /// <summary>
/// 设置ip黑名单 /// 设置ip不可用
/// </summary> /// </summary>
/// <param name="address">ip</param> /// <param name="address">ip</param>
/// <param name="expiration">过期时间</param> /// <param name="expiration">过期时间</param>
void SetBlack(IPAddress address, TimeSpan expiration); void SetDisabled(IPAddress address, TimeSpan expiration);
/// <summary> /// <summary>
/// 刷新域名解析结果 /// 刷新域名解析结果

View File

@ -135,7 +135,7 @@ namespace FastGithub.Http
if (IPAddress.TryParse(request.RequestUri.Host, out var address)) 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) if (request.Headers.Host != null)