Allow matching for passthru resolver on all resolution paths. (#158)

Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
Jason Volk
2025-09-12 04:11:29 +00:00
parent 10fb1cd192
commit 42d143c013

View File

@@ -7,7 +7,7 @@ use hickory_resolver::{
lookup_ip::LookupIp, lookup_ip::LookupIp,
}; };
use reqwest::dns::{Addrs, Name, Resolve, Resolving}; use reqwest::dns::{Addrs, Name, Resolve, Resolving};
use tuwunel_core::{Result, Server, err}; use tuwunel_core::{Result, Server, err, trace};
use super::cache::{Cache, CachedOverride}; use super::cache::{Cache, CachedOverride};
@@ -20,6 +20,7 @@ pub struct Resolver {
pub(crate) struct Hooked { pub(crate) struct Hooked {
resolver: Arc<TokioResolver>, resolver: Arc<TokioResolver>,
passthru: Arc<Passthru>,
cache: Arc<Cache>, cache: Arc<Cache>,
server: Arc<Server>, server: Arc<Server>,
} }
@@ -44,19 +45,20 @@ impl Resolver {
opts.positive_min_ttl = None; opts.positive_min_ttl = None;
opts.positive_max_ttl = None; opts.positive_max_ttl = None;
opts.cache_size = ResolverOpts::default().cache_size; opts.cache_size = ResolverOpts::default().cache_size;
let passthru = Self::create(server, conf, opts)?; let passthru = Arc::new(Passthru {
resolver: Self::create(server, conf, opts)?,
server: server.clone(),
});
Ok(Arc::new(Self { Ok(Arc::new(Self {
hooked: Arc::new(Hooked { hooked: Arc::new(Hooked {
server: server.clone(),
resolver: resolver.clone(), resolver: resolver.clone(),
passthru: passthru.clone(),
server: server.clone(),
cache, cache,
}), }),
passthru: Arc::new(Passthru {
server: server.clone(),
resolver: passthru,
}),
server: server.clone(), server: server.clone(),
passthru,
resolver, resolver,
})) }))
} }
@@ -145,8 +147,10 @@ impl Resolve for Resolver {
.dns_passthru_domains .dns_passthru_domains
.is_match(name.as_str()) .is_match(name.as_str())
{ {
trace!(?name, "matched to passthru resolver");
&self.passthru.resolver &self.passthru.resolver
} else { } else {
trace!(?name, "using primary resolver");
&self.resolver &self.resolver
}; };
@@ -154,16 +158,29 @@ impl Resolve for Resolver {
} }
} }
impl Resolve for Passthru { impl Resolve for Hooked {
fn resolve(&self, name: Name) -> Resolving { fn resolve(&self, name: Name) -> Resolving {
resolve_to_reqwest(self.server.clone(), self.resolver.clone(), name).boxed() let resolver = if self
.server
.config
.dns_passthru_domains
.is_match(name.as_str())
{
trace!(?name, "matched to passthru resolver");
&self.passthru.resolver
} else {
trace!(?name, "using hooked resolver");
&self.resolver
};
hooked_resolve(self.cache.clone(), self.server.clone(), resolver.clone(), name).boxed()
} }
} }
impl Resolve for Hooked { impl Resolve for Passthru {
fn resolve(&self, name: Name) -> Resolving { fn resolve(&self, name: Name) -> Resolving {
hooked_resolve(self.cache.clone(), self.server.clone(), self.resolver.clone(), name) trace!(?name, "using passthru resolver");
.boxed() resolve_to_reqwest(self.server.clone(), self.resolver.clone(), name).boxed()
} }
} }