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}