Skip to main content

reqwest/async_impl/h3_client/
dns.rs

1use core::task;
2use hyper_util::client::legacy::connect::dns::Name;
3use std::future::Future;
4use std::net::SocketAddr;
5use std::task::Poll;
6use tower_service::Service;
7
8// Trait from hyper to implement DNS resolution for HTTP/3 client.
9pub trait Resolve {
10    type Addrs: Iterator<Item = SocketAddr>;
11    type Error: Into<Box<dyn std::error::Error + Send + Sync>>;
12    type Future: Future<Output = Result<Self::Addrs, Self::Error>>;
13
14    fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>>;
15    fn resolve(&mut self, name: Name) -> Self::Future;
16}
17
18impl<S> Resolve for S
19where
20    S: Service<Name>,
21    S::Response: Iterator<Item = SocketAddr>,
22    S::Error: Into<Box<dyn std::error::Error + Send + Sync>>,
23{
24    type Addrs = S::Response;
25    type Error = S::Error;
26    type Future = S::Future;
27
28    fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>> {
29        Service::poll_ready(self, cx)
30    }
31
32    fn resolve(&mut self, name: Name) -> Self::Future {
33        Service::call(self, name)
34    }
35}
36
37pub(super) async fn resolve<R>(resolver: &mut R, name: Name) -> Result<R::Addrs, R::Error>
38where
39    R: Resolve,
40{
41    std::future::poll_fn(|cx| resolver.poll_ready(cx)).await?;
42    resolver.resolve(name).await
43}