slightly simplify reqwest/hickory hooks
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
9787dfe77c
commit
e7e606300f
1 changed files with 26 additions and 33 deletions
|
@ -1,15 +1,11 @@
|
||||||
use std::{
|
use std::{iter, net::SocketAddr, sync::Arc, time::Duration};
|
||||||
future, iter,
|
|
||||||
net::{IpAddr, SocketAddr},
|
|
||||||
sync::Arc,
|
|
||||||
time::Duration,
|
|
||||||
};
|
|
||||||
|
|
||||||
use conduit::{err, Result, Server};
|
use conduit::{err, Result, Server};
|
||||||
|
use futures::FutureExt;
|
||||||
use hickory_resolver::TokioAsyncResolver;
|
use hickory_resolver::TokioAsyncResolver;
|
||||||
use reqwest::dns::{Addrs, Name, Resolve, Resolving};
|
use reqwest::dns::{Addrs, Name, Resolve, Resolving};
|
||||||
|
|
||||||
use super::cache::Cache;
|
use super::cache::{Cache, CachedOverride};
|
||||||
|
|
||||||
pub struct Resolver {
|
pub struct Resolver {
|
||||||
pub(crate) resolver: Arc<TokioAsyncResolver>,
|
pub(crate) resolver: Arc<TokioAsyncResolver>,
|
||||||
|
@ -21,6 +17,8 @@ pub(crate) struct Hooked {
|
||||||
cache: Arc<Cache>,
|
cache: Arc<Cache>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ResolvingResult = Result<Addrs, Box<dyn std::error::Error + Send + Sync>>;
|
||||||
|
|
||||||
impl Resolver {
|
impl Resolver {
|
||||||
#[allow(clippy::as_conversions, clippy::cast_sign_loss, clippy::cast_possible_truncation)]
|
#[allow(clippy::as_conversions, clippy::cast_sign_loss, clippy::cast_possible_truncation)]
|
||||||
pub(super) fn build(server: &Arc<Server>, cache: Arc<Cache>) -> Result<Arc<Self>> {
|
pub(super) fn build(server: &Arc<Server>, cache: Arc<Cache>) -> Result<Arc<Self>> {
|
||||||
|
@ -82,12 +80,12 @@ impl Resolver {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Resolve for Resolver {
|
impl Resolve for Resolver {
|
||||||
fn resolve(&self, name: Name) -> Resolving { resolve_to_reqwest(self.resolver.clone(), name) }
|
fn resolve(&self, name: Name) -> Resolving { resolve_to_reqwest(self.resolver.clone(), name).boxed() }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Resolve for Hooked {
|
impl Resolve for Hooked {
|
||||||
fn resolve(&self, name: Name) -> Resolving {
|
fn resolve(&self, name: Name) -> Resolving {
|
||||||
let cached = self
|
let cached: Option<CachedOverride> = self
|
||||||
.cache
|
.cache
|
||||||
.overrides
|
.overrides
|
||||||
.read()
|
.read()
|
||||||
|
@ -95,35 +93,30 @@ impl Resolve for Hooked {
|
||||||
.get(name.as_str())
|
.get(name.as_str())
|
||||||
.cloned();
|
.cloned();
|
||||||
|
|
||||||
if let Some(cached) = cached {
|
cached.map_or_else(
|
||||||
cached_to_reqwest(&cached.ips, cached.port)
|
|| resolve_to_reqwest(self.resolver.clone(), name).boxed(),
|
||||||
} else {
|
|cached| cached_to_reqwest(cached).boxed(),
|
||||||
resolve_to_reqwest(self.resolver.clone(), name)
|
)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn cached_to_reqwest(override_name: &[IpAddr], port: u16) -> Resolving {
|
async fn cached_to_reqwest(cached: CachedOverride) -> ResolvingResult {
|
||||||
override_name
|
let first_ip = cached
|
||||||
|
.ips
|
||||||
.first()
|
.first()
|
||||||
.map(|first_name| -> Resolving {
|
.expect("must provide at least one override");
|
||||||
let saddr = SocketAddr::new(*first_name, port);
|
|
||||||
let result: Box<dyn Iterator<Item = SocketAddr> + Send> = Box::new(iter::once(saddr));
|
let saddr = SocketAddr::new(*first_ip, cached.port);
|
||||||
Box::pin(future::ready(Ok(result)))
|
|
||||||
})
|
Ok(Box::new(iter::once(saddr)))
|
||||||
.expect("must provide at least one override name")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_to_reqwest(resolver: Arc<TokioAsyncResolver>, name: Name) -> Resolving {
|
async fn resolve_to_reqwest(resolver: Arc<TokioAsyncResolver>, name: Name) -> ResolvingResult {
|
||||||
Box::pin(async move {
|
let results = resolver
|
||||||
let results = resolver
|
.lookup_ip(name.as_str())
|
||||||
.lookup_ip(name.as_str())
|
.await?
|
||||||
.await?
|
.into_iter()
|
||||||
.into_iter()
|
.map(|ip| SocketAddr::new(ip, 0));
|
||||||
.map(|ip| SocketAddr::new(ip, 0));
|
|
||||||
|
|
||||||
let results: Addrs = Box::new(results);
|
Ok(Box::new(results))
|
||||||
|
|
||||||
Ok(results)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue