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,
};
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};
@@ -20,6 +20,7 @@ pub struct Resolver {
pub(crate) struct Hooked {
resolver: Arc<TokioResolver>,
passthru: Arc<Passthru>,
cache: Arc<Cache>,
server: Arc<Server>,
}
@@ -44,19 +45,20 @@ impl Resolver {
opts.positive_min_ttl = None;
opts.positive_max_ttl = None;
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 {
hooked: Arc::new(Hooked {
server: server.clone(),
resolver: resolver.clone(),
passthru: passthru.clone(),
server: server.clone(),
cache,
}),
passthru: Arc::new(Passthru {
server: server.clone(),
resolver: passthru,
}),
server: server.clone(),
passthru,
resolver,
}))
}
@@ -145,8 +147,10 @@ impl Resolve for Resolver {
.dns_passthru_domains
.is_match(name.as_str())
{
trace!(?name, "matched to passthru resolver");
&self.passthru.resolver
} else {
trace!(?name, "using primary 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 {
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 {
hooked_resolve(self.cache.clone(), self.server.clone(), self.resolver.clone(), name)
.boxed()
trace!(?name, "using passthru resolver");
resolve_to_reqwest(self.server.clone(), self.resolver.clone(), name).boxed()
}
}