Skip to content

Commit 77c2408

Browse files
committed
refactor: add add_to_specific_cache method and CacheType enum to avoid code duplication in ResolverCache::add
1 parent 703b986 commit 77c2408

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/resolver_cache.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ use crate::message::DnsMessage;
99

1010
use std::num::NonZeroUsize;
1111

12+
#[derive(Debug, Clone, Copy)]
13+
pub enum CacheType {
14+
Answer,
15+
Authority,
16+
Additional,
17+
}
18+
1219
#[derive(Clone, Debug)]
1320
pub struct ResolverCache {
1421
cache_answer: DnsCache,
@@ -117,6 +124,23 @@ impl ResolverCache {
117124
}
118125
}
119126

127+
/// Adds an element to the specified cache
128+
fn add_to_specific_cache(
129+
&mut self,
130+
cache_type: CacheType,
131+
domain_name: DomainName,
132+
resource_record: ResourceRecord,
133+
qtype: Option<Rrtype>,
134+
qclass: Rclass,
135+
rcode: Option<Rcode>,
136+
) {
137+
match cache_type {
138+
CacheType::Answer => self.add_answer(domain_name, resource_record, qtype, qclass, rcode),
139+
CacheType::Authority => self.add_authority(domain_name, resource_record, qtype, qclass, rcode),
140+
CacheType::Additional => self.add_additional(domain_name, resource_record, qtype, qclass, rcode),
141+
}
142+
}
143+
120144
/// Adds an answer to the cache
121145
pub fn add(&mut self, message: DnsMessage) {
122146
let qname = message.get_question().get_qname();
@@ -137,6 +161,25 @@ impl ResolverCache {
137161
}
138162

139163
// Get the minimum TTL from the SOA record if the answer is negative
164+
let minimum = message
165+
.get_authority()
166+
.iter()
167+
.find_map(|rr| match rr.get_rdata() {
168+
Rdata::SOA(soa) => Some(soa.get_minimum()),
169+
_ => None,
170+
}).unwrap_or(0);
171+
172+
for (rr_set, cache_type) in [
173+
(message.get_answer(), CacheType::Answer),
174+
(message.get_authority(), CacheType::Authority),
175+
(message.get_additional(), CacheType::Additional),
176+
] {
177+
for mut rr in rr_set {
178+
if minimum != 0 { rr.set_ttl(minimum); }
179+
self.add_to_specific_cache(cache_type, qname.clone(), rr, qtype, qclass, rcode);
180+
}
181+
}
182+
/*
140183
let mut minimum = 0;
141184
if rcode != Some(Rcode::NOERROR) {
142185
for rr in message.get_authority() {
@@ -179,6 +222,7 @@ impl ResolverCache {
179222
}
180223
self.add_additional(qname.clone(), rr.clone(), qtype, qclass, rcode);
181224
});
225+
*/
182226
}
183227

184228
/// Gets elements from the answer cache

0 commit comments

Comments
 (0)