@@ -9,6 +9,13 @@ use crate::message::DnsMessage;
9
9
10
10
use std:: num:: NonZeroUsize ;
11
11
12
+ #[ derive( Debug , Clone , Copy ) ]
13
+ pub enum CacheType {
14
+ Answer ,
15
+ Authority ,
16
+ Additional ,
17
+ }
18
+
12
19
#[ derive( Clone , Debug ) ]
13
20
pub struct ResolverCache {
14
21
cache_answer : DnsCache ,
@@ -117,6 +124,23 @@ impl ResolverCache {
117
124
}
118
125
}
119
126
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
+
120
144
/// Adds an answer to the cache
121
145
pub fn add ( & mut self , message : DnsMessage ) {
122
146
let qname = message. get_question ( ) . get_qname ( ) ;
@@ -137,6 +161,25 @@ impl ResolverCache {
137
161
}
138
162
139
163
// 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
+ /*
140
183
let mut minimum = 0;
141
184
if rcode != Some(Rcode::NOERROR) {
142
185
for rr in message.get_authority() {
@@ -179,6 +222,7 @@ impl ResolverCache {
179
222
}
180
223
self.add_additional(qname.clone(), rr.clone(), qtype, qclass, rcode);
181
224
});
225
+ */
182
226
}
183
227
184
228
/// Gets elements from the answer cache
0 commit comments