排除不可用的ip
This commit is contained in:
parent
21dc7dc371
commit
8cc28f5f47
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
/// 刷新域名解析结果
|
/// 刷新域名解析结果
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user