feat(question): add SVCB, LOC, NAPTR variants to QueryType

Logs were printing UNKNOWN(64), UNKNOWN(29), UNKNOWN(35) for SVCB,
LOC, and NAPTR — three RR types that have been registered for years
and show up in the wild (notably SVCB via RFC 9462 DDR clients
querying _dns.resolver.arpa).

Adds the variants and replaces the SVCB_QTYPE u16 const introduced
in #119 with QueryType::SVCB.to_num(), matching the HTTPS path.

Closes #114.
This commit is contained in:
Razvan Dimescu
2026-04-19 07:49:35 +03:00
parent 6bc02982f0
commit 24610ae3fe
2 changed files with 20 additions and 6 deletions

View File

@@ -511,13 +511,12 @@ fn strip_dnssec_records(pkt: &mut DnsPacket) {
pkt.resources.retain(|r| !is_dnssec_record(r));
}
const SVCB_QTYPE: u16 = 64;
fn strip_svcb_ipv6_hints(pkt: &mut DnsPacket) {
let https_qtype = QueryType::HTTPS.to_num();
let svcb_qtype = QueryType::SVCB.to_num();
pkt.for_each_record_mut(|rec| {
if let DnsRecord::UNKNOWN { qtype, data, .. } = rec {
if *qtype == https_qtype || *qtype == SVCB_QTYPE {
if *qtype == https_qtype || *qtype == svcb_qtype {
if let Some(new_data) = crate::svcb::strip_ipv6hint(data) {
*data = new_data;
}
@@ -1307,7 +1306,7 @@ mod tests {
let mut svcb_pkt = pkt.clone();
svcb_pkt.questions[0].name = "svc.test".to_string();
svcb_pkt.questions[0].qtype = QueryType::UNKNOWN(64);
svcb_pkt.questions[0].qtype = QueryType::SVCB;
if let DnsRecord::UNKNOWN { domain, qtype, .. } = &mut svcb_pkt.answers[0] {
*domain = "svc.test".to_string();
*qtype = 64;
@@ -1322,12 +1321,12 @@ mod tests {
ctx.cache
.write()
.unwrap()
.insert("svc.test", QueryType::UNKNOWN(64), &svcb_pkt);
.insert("svc.test", QueryType::SVCB, &svcb_pkt);
let ctx = Arc::new(ctx);
for (name, qtype, label) in [
("hints.test", QueryType::HTTPS, "HTTPS"),
("svc.test", QueryType::UNKNOWN(64), "SVCB"),
("svc.test", QueryType::SVCB, "SVCB"),
] {
let (resp, path) = resolve_in_test(&ctx, name, qtype).await;
assert_eq!(path, QueryPath::Cached, "{label}");

View File

@@ -12,13 +12,16 @@ pub enum QueryType {
MX, // 15
TXT, // 16
AAAA, // 28
LOC, // 29
SRV, // 33
NAPTR, // 35
DS, // 43
RRSIG, // 46
NSEC, // 47
DNSKEY, // 48
NSEC3, // 50
OPT, // 41 (EDNS0 pseudo-type)
SVCB, // 64
HTTPS, // 65
}
@@ -34,13 +37,16 @@ impl QueryType {
QueryType::MX => 15,
QueryType::TXT => 16,
QueryType::AAAA => 28,
QueryType::LOC => 29,
QueryType::SRV => 33,
QueryType::NAPTR => 35,
QueryType::OPT => 41,
QueryType::DS => 43,
QueryType::RRSIG => 46,
QueryType::NSEC => 47,
QueryType::DNSKEY => 48,
QueryType::NSEC3 => 50,
QueryType::SVCB => 64,
QueryType::HTTPS => 65,
}
}
@@ -55,13 +61,16 @@ impl QueryType {
15 => QueryType::MX,
16 => QueryType::TXT,
28 => QueryType::AAAA,
29 => QueryType::LOC,
33 => QueryType::SRV,
35 => QueryType::NAPTR,
41 => QueryType::OPT,
43 => QueryType::DS,
46 => QueryType::RRSIG,
47 => QueryType::NSEC,
48 => QueryType::DNSKEY,
50 => QueryType::NSEC3,
64 => QueryType::SVCB,
65 => QueryType::HTTPS,
_ => QueryType::UNKNOWN(num),
}
@@ -77,13 +86,16 @@ impl QueryType {
QueryType::MX => "MX",
QueryType::TXT => "TXT",
QueryType::AAAA => "AAAA",
QueryType::LOC => "LOC",
QueryType::SRV => "SRV",
QueryType::NAPTR => "NAPTR",
QueryType::OPT => "OPT",
QueryType::DS => "DS",
QueryType::RRSIG => "RRSIG",
QueryType::NSEC => "NSEC",
QueryType::DNSKEY => "DNSKEY",
QueryType::NSEC3 => "NSEC3",
QueryType::SVCB => "SVCB",
QueryType::HTTPS => "HTTPS",
QueryType::UNKNOWN(_) => "UNKNOWN",
}
@@ -99,12 +111,15 @@ impl QueryType {
"MX" => Some(QueryType::MX),
"TXT" => Some(QueryType::TXT),
"AAAA" => Some(QueryType::AAAA),
"LOC" => Some(QueryType::LOC),
"SRV" => Some(QueryType::SRV),
"NAPTR" => Some(QueryType::NAPTR),
"DS" => Some(QueryType::DS),
"RRSIG" => Some(QueryType::RRSIG),
"DNSKEY" => Some(QueryType::DNSKEY),
"NSEC" => Some(QueryType::NSEC),
"NSEC3" => Some(QueryType::NSEC3),
"SVCB" => Some(QueryType::SVCB),
"HTTPS" => Some(QueryType::HTTPS),
_ => None,
}