ureq/
resolve.rs

1use std::fmt;
2use std::io;
3use std::net::{SocketAddr, ToSocketAddrs};
4use std::sync::Arc;
5
6/// A custom resolver to override the default DNS behavior.
7pub trait Resolver: Send + Sync {
8    fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>>;
9}
10
11#[derive(Debug)]
12pub(crate) struct StdResolver;
13
14impl Resolver for StdResolver {
15    fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>> {
16        ToSocketAddrs::to_socket_addrs(netloc).map(|iter| iter.collect())
17    }
18}
19
20impl<F> Resolver for F
21where
22    F: Fn(&str) -> io::Result<Vec<SocketAddr>>,
23    F: Send + Sync,
24{
25    fn resolve(&self, netloc: &str) -> io::Result<Vec<SocketAddr>> {
26        self(netloc)
27    }
28}
29
30#[derive(Clone)]
31pub(crate) struct ArcResolver(Arc<dyn Resolver>);
32
33impl<R> From<R> for ArcResolver
34where
35    R: Resolver + 'static,
36{
37    fn from(r: R) -> Self {
38        Self(Arc::new(r))
39    }
40}
41
42impl fmt::Debug for ArcResolver {
43    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
44        write!(f, "ArcResolver(...)")
45    }
46}
47
48impl std::ops::Deref for ArcResolver {
49    type Target = dyn Resolver;
50
51    fn deref(&self) -> &Self::Target {
52        self.0.as_ref()
53    }
54}