Fix DNS TXT record query.

This commit is contained in:
2025-08-11 17:05:55 +02:00
parent dbba246f9a
commit 77cd64dda5
+64 -2
View File
@@ -340,6 +340,15 @@ impl DnsTest {
} }
}; };
// Debug: Show original configuration
log::info!(
"Original DNS config: {} name servers",
config.name_servers().len()
);
for ns in config.name_servers() {
log::info!(" Name server: {}", ns.socket_addr);
}
// Clear search domains to prevent automatic domain expansion during DNS testing // Clear search domains to prevent automatic domain expansion during DNS testing
// This ensures we query the exact domain name provided // This ensures we query the exact domain name provided
// Create a new config with the same name servers but no search domains // Create a new config with the same name servers but no search domains
@@ -349,8 +358,22 @@ impl DnsTest {
} }
config = clean_config; config = clean_config;
// Ensure we don't use search domains // Ensure we don't use search domains and optimize for large responses
opts.ndots = 0; opts.ndots = 0;
opts.timeout = self.timeout;
// Enable more retries for reliability
opts.attempts = 3;
// Enable EDNS0 for extended DNS features (large responses)
opts.edns0 = true;
log::info!(
"DNS resolver options: timeout={}s, edns0={}, attempts={}",
opts.timeout.as_secs(),
opts.edns0,
opts.attempts
);
let resolver = TokioAsyncResolver::tokio(config, opts); let resolver = TokioAsyncResolver::tokio(config, opts);
@@ -391,13 +414,31 @@ impl DnsTest {
) )
} }
RecordType::TXT => { RecordType::TXT => {
log::info!("Starting TXT lookup for domain: {}", self.domain);
let lookup_result = resolver.txt_lookup(name.clone()).await; let lookup_result = resolver.txt_lookup(name.clone()).await;
log::info!("TXT lookup completed for domain: {}", self.domain);
match &lookup_result {
Ok(lookup) => {
let count = lookup.iter().count();
log::info!(
"TXT lookup success: found {} records for {}",
count,
self.domain
);
}
Err(e) => {
log::warn!("TXT lookup error for {}: {}", self.domain, e);
}
}
handle_dns_lookup_result( handle_dns_lookup_result(
lookup_result, lookup_result,
"TXT", "TXT",
|lookup| { |lookup| {
let records: Vec<String> = let records: Vec<String> =
lookup.iter().map(|txt| txt.to_string()).collect(); lookup.iter().map(|txt| txt.to_string()).collect();
log::info!("TXT records for {}: {} total", self.domain, records.len());
format!("TXT records: {}", records.join(", ")) format!("TXT records: {}", records.join(", "))
}, },
"(none - no text records found)", "(none - no text records found)",
@@ -504,7 +545,20 @@ impl DnsTest {
server, server,
hickory_resolver::config::Protocol::Udp, hickory_resolver::config::Protocol::Udp,
)); ));
let opts = ResolverOpts::default();
// Use the same optimized options as system resolver
let mut opts = ResolverOpts::default();
opts.ndots = 0;
opts.timeout = self.timeout;
opts.attempts = 3;
opts.edns0 = true; // Critical: Enable EDNS0 for large TXT records
log::info!(
"Specific server DNS resolver options: timeout={}s, edns0={}, attempts={}",
opts.timeout.as_secs(),
opts.edns0,
opts.attempts
);
let resolver = TokioAsyncResolver::tokio(config, opts); let resolver = TokioAsyncResolver::tokio(config, opts);
@@ -529,6 +583,14 @@ impl DnsTest {
let ips: Vec<String> = lookup.iter().map(|ip| ip.to_string()).collect(); let ips: Vec<String> = lookup.iter().map(|ip| ip.to_string()).collect();
Ok(format!("AAAA records: {}", ips.join(", "))) Ok(format!("AAAA records: {}", ips.join(", ")))
} }
RecordType::TXT => {
let lookup = resolver
.txt_lookup(name.clone())
.await
.map_err(|e| format!("TXT lookup failed: {}", e))?;
let records: Vec<String> = lookup.iter().map(|txt| txt.to_string()).collect();
Ok(format!("TXT records: {}", records.join(", ")))
}
_ => { _ => {
let lookup = resolver let lookup = resolver
.lookup(name.clone(), self.record_type) .lookup(name.clone(), self.record_type)