Allow matching for passthru resolver on all resolution paths. (#158)
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user