actix_tls/connect/
resolve.rs

1//! The [`Resolve`] trait.
2
3use std::{error::Error as StdError, net::SocketAddr};
4
5use futures_core::future::LocalBoxFuture;
6
7/// Custom async DNS resolvers.
8///
9/// # Examples
10/// ```
11/// use std::net::SocketAddr;
12///
13/// use actix_tls::connect::{Resolve, Resolver};
14/// use futures_util::future::LocalBoxFuture;
15///
16/// // use trust-dns async tokio resolver
17/// use trust_dns_resolver::TokioAsyncResolver;
18///
19/// struct MyResolver {
20///     trust_dns: TokioAsyncResolver,
21/// };
22///
23/// // impl Resolve trait and convert given host address str and port to SocketAddr.
24/// impl Resolve for MyResolver {
25///     fn lookup<'a>(
26///         &'a self,
27///         host: &'a str,
28///         port: u16,
29///     ) -> LocalBoxFuture<'a, Result<Vec<SocketAddr>, Box<dyn std::error::Error>>> {
30///         Box::pin(async move {
31///             let res = self
32///                 .trust_dns
33///                 .lookup_ip(host)
34///                 .await?
35///                 .iter()
36///                 .map(|ip| SocketAddr::new(ip, port))
37///                 .collect();
38///             Ok(res)
39///         })
40///     }
41/// }
42///
43/// let my_resolver = MyResolver {
44///     trust_dns: TokioAsyncResolver::tokio_from_system_conf().unwrap(),
45/// };
46///
47/// // wrap custom resolver
48/// let resolver = Resolver::custom(my_resolver);
49///
50/// // resolver can be passed to connector factory where returned service factory
51/// // can be used to construct new connector services for use in clients
52/// let factory = actix_tls::connect::Connector::new(resolver);
53/// let connector = factory.service();
54/// ```
55pub trait Resolve {
56    /// Given DNS lookup information, returns a future that completes with socket information.
57    fn lookup<'a>(
58        &'a self,
59        host: &'a str,
60        port: u16,
61    ) -> LocalBoxFuture<'a, Result<Vec<SocketAddr>, Box<dyn StdError>>>;
62}