mirror of
https://github.com/BeyondDimension/SteamTools.git
synced 2026-10-27 04:41:15 +08:00
🐛 DoH
This commit is contained in:
+37
-30
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user