This commit is contained in:
Aigio Liu
2023-09-16 18:03:02 +08:00
parent cac4a9370a
commit 0925ec9104
2 changed files with 60 additions and 33 deletions
@@ -83,10 +83,10 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory
return 0;
}
/// <summary>
/// DNS 解析查询最大递归查询次数
/// </summary>
const byte max_recursion_dns_query = 20;
///// <summary>
///// DNS 解析查询最大递归查询次数
///// </summary>
//const byte max_recursion_dns_query = 20;
static readonly TimeSpan TTL = TimeSpan.FromMinutes(9.9D);
@@ -104,37 +104,37 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory
Uri dohAddresUri,
string hostNameOrAddress,
DnsQueryType queryType = DnsQueryType.A,
byte count = 1,
HashSet<string>? domainHistory = null,
//byte count = 1,
//HashSet<string>? domainHistory = null,
CancellationToken cancellationToken = default)
{
if (count <= max_recursion_dns_query)
{
domainHistory ??= new();
var query = DnsQueryFactory.CreateQuery(hostNameOrAddress, queryType);
var dnsClient = GetDnsHttpClient(dohAddresUri);
var answer = await dnsClient.Query(query, cancellationToken);
//if (count <= max_recursion_dns_query)
//{
// domainHistory ??= new();
var query = DnsQueryFactory.CreateQuery(hostNameOrAddress, queryType);
var dnsClient = GetDnsHttpClient(dohAddresUri);
var answer = await dnsClient.Query(query, cancellationToken);
var dnsResources = answer.Answers.Select(x => x.Resource);
var dnsResources = answer.Answers.Select(x => x.Resource);
var iPAddresses = dnsResources.OfType<DnsIpAddressResource>().Select(x => x.IPAddress).ToArray();
if (iPAddresses.Any())
return iPAddresses;
var iPAddresses = dnsResources.OfType<DnsIpAddressResource>().Select(x => x.IPAddress).ToArray();
if (iPAddresses.Any())
return iPAddresses;
var domainRes = dnsResources.OfType<DnsDomainResource>().FirstOrDefault();
if (domainRes != null)
{
var domain = domainRes.Domain;
if (!string.IsNullOrWhiteSpace(domain))
{
if (domainHistory.Add(domain))
{
// CNAME 递归解析
iPAddresses = await Query(dohAddresUri, domain, queryType, ++count, domainHistory, cancellationToken);
}
}
}
}
//var domainRes = dnsResources.OfType<DnsDomainResource>().FirstOrDefault();
//if (domainRes != null)
//{
// var domain = domainRes.Domain;
// if (!string.IsNullOrWhiteSpace(domain))
// {
// //if (domainHistory.Add(domain))
// //{
// // CNAME 递归解析
// iPAddresses = await Query(dohAddresUri, domain, queryType,/* ++count, domainHistory,*/ cancellationToken);
// //}
// }
//}
////}
return Array.Empty<IPAddress>();
}
@@ -181,6 +181,13 @@ sealed class DnsDohAnalysisService : GeneralHttpClientFactory
}
var result = await Query(dohAddresUri, hostNameOrAddress, queryType, cancellationToken: cancellationToken);
if (isIPv6 && !result.Any())
{
// IPv6 返回空时使用 IPv4 解析
result = await Query(dohAddresUri, hostNameOrAddress, DnsQueryType.A, cancellationToken: cancellationToken);
}
if (useCache)
{
Cache[cacheKey] = new()
+23 -3
View File
@@ -11,7 +11,8 @@ public sealed class DnsDohAnalysisTest
{
s.AddLogging(s => s.AddConsole());
s.TryAddClientHttpPlatformHelperService();
s.AddFusilladeHttpClient();
FusilladeHttpClientFactory2 factory = new();
s.AddSingleton<IHttpClientFactory>(factory);
s.AddSingleton<DnsDohAnalysisService>();
});
@@ -23,8 +24,8 @@ public sealed class DnsDohAnalysisTest
DNS_Ali_DohAddres,
DNS_Ali_DohAddres2,
DNS_Ali_DohAddres3,
Google_DohAddres,
Cloudflare_DohAddres,
//Google_DohAddres,
//Cloudflare_DohAddres,
DohAddres_360,
TUNA_DohAddres,
};
@@ -62,4 +63,23 @@ public sealed class DnsDohAnalysisTest
Console.WriteLine("--------------------");
}
}
}
sealed class FusilladeHttpClientFactory2 : FusilladeHttpClientFactory
{
protected override HttpClient CreateClient(HttpMessageHandler handler)
{
var client = new HttpClient(handler);
try
{
client.Timeout = TimeSpan.FromSeconds(14.5D);
}
catch
{
}
return client;
}
}