优化域名解析

This commit is contained in:
老九 2021-09-07 10:26:21 +08:00
parent 977c69b9f8
commit 37bfc3db83

View File

@ -83,16 +83,7 @@ namespace FastGithub.DomainResolve
try try
{ {
await semaphore.WaitAsync(); await semaphore.WaitAsync();
return await this.ResolveCoreAsync(domain, cancellationToken);
for (var i = 0; i < 2; i++)
{
var address = await this.ResolveCoreAsync(domain, cancellationToken);
if (address != null)
{
return address;
}
}
throw new FastGithubException($"当前解析不到{domain.Host}可用的ip请刷新重试");
} }
finally finally
{ {
@ -106,8 +97,9 @@ namespace FastGithub.DomainResolve
/// <param name="domain"></param> /// <param name="domain"></param>
/// <param name="cancellationToken"></param> /// <param name="cancellationToken"></param>
/// <exception cref="OperationCanceledException"></exception> /// <exception cref="OperationCanceledException"></exception>
/// <exception cref="FastGithubException"></exception>
/// <returns></returns> /// <returns></returns>
private async Task<IPAddress?> ResolveCoreAsync(DnsEndPoint domain, CancellationToken cancellationToken) private async Task<IPAddress> ResolveCoreAsync(DnsEndPoint domain, CancellationToken cancellationToken)
{ {
if (this.domainResolveCache.TryGetValue<IPAddress>(domain, out var address) && address != null) if (this.domainResolveCache.TryGetValue<IPAddress>(domain, out var address) && address != null)
{ {
@ -115,10 +107,7 @@ namespace FastGithub.DomainResolve
} }
var expiration = this.dnscryptExpiration; var expiration = this.dnscryptExpiration;
if (this.dnscryptProxy.LocalEndPoint != null) address = await this.LookupByDnscryptAsync(domain, cancellationToken);
{
address = await this.LookupAsync(this.dnscryptProxy.LocalEndPoint, domain, cancellationToken);
}
if (address == null) if (address == null)
{ {
@ -128,7 +117,7 @@ namespace FastGithub.DomainResolve
if (address == null) if (address == null)
{ {
return null; throw new FastGithubException($"当前解析不到{domain.Host}可用的ip请刷新重试");
} }
// 往往是被污染的dns // 往往是被污染的dns
@ -141,6 +130,31 @@ namespace FastGithub.DomainResolve
return address; return address;
} }
/// <summary>
/// Dnscrypt查找ip
/// </summary>
/// <param name="domain"></param>
/// <param name="cancellationToken"></param>
/// <param name="maxTryCount"></param>
/// <returns></returns>
private async Task<IPAddress?> LookupByDnscryptAsync(DnsEndPoint domain, CancellationToken cancellationToken, int maxTryCount = 2)
{
if (this.dnscryptProxy.LocalEndPoint != null)
{
for (var i = 0; i < maxTryCount; i++)
{
var address = await this.LookupAsync(this.dnscryptProxy.LocalEndPoint, domain, cancellationToken);
if (address != null)
{
return address;
}
}
}
return default;
}
/// <summary> /// <summary>
/// 回退查找ip /// 回退查找ip
/// </summary> /// </summary>