refactor(client): return HttpConnecting newtype
This commit is contained in:
		| @@ -1,5 +1,6 @@ | ||||
| use std::error::Error as StdError; | ||||
| use std::future::Future; | ||||
| use std::marker::PhantomData; | ||||
| use std::pin::Pin; | ||||
| use std::task::{self, Poll}; | ||||
| use std::fmt; | ||||
| @@ -11,6 +12,7 @@ use std::time::Duration; | ||||
| use futures_util::future::Either; | ||||
| use http::uri::{Scheme, Uri}; | ||||
| use net2::TcpBuilder; | ||||
| use pin_project::pin_project; | ||||
| use tokio::net::TcpStream; | ||||
| use tokio::time::Delay; | ||||
|  | ||||
| @@ -18,6 +20,7 @@ use super::dns::{self, resolve, GaiResolver, Resolve}; | ||||
| use super::{Connected, Destination}; | ||||
| //#[cfg(feature = "runtime")] use super::dns::TokioThreadpoolGaiResolver; | ||||
|  | ||||
|  | ||||
| /// A connector for the `http` scheme. | ||||
| /// | ||||
| /// Performs DNS resolution in a thread pool, and then connects over TCP. | ||||
| @@ -233,8 +236,7 @@ where | ||||
| { | ||||
|     type Response = (TcpStream, Connected); | ||||
|     type Error = ConnectError; | ||||
|     type Future = | ||||
|         Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + 'static>>; | ||||
|     type Future = HttpConnecting<R>; | ||||
|  | ||||
|     fn poll_ready(&mut self, cx: &mut task::Context<'_>) -> Poll<Result<(), Self::Error>> { | ||||
|         ready!(self.resolver.poll_ready(cx)).map_err(ConnectError::dns)?; | ||||
| @@ -243,7 +245,10 @@ where | ||||
|  | ||||
|     fn call(&mut self, dst: Destination) -> Self::Future { | ||||
|         let mut self_ = self.clone(); | ||||
|         Box::pin(async move { self_.call_async(dst).await }) | ||||
|         HttpConnecting { | ||||
|             fut: Box::pin(async move { self_.call_async(dst).await }), | ||||
|             _marker: PhantomData, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -373,6 +378,32 @@ impl HttpInfo { | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Not publicly exported (so missing_docs doesn't trigger). | ||||
| // | ||||
| // We return this `Future` instead of the `Pin<Box<dyn Future>>` directly | ||||
| // so that users don't rely on it fitting in a `Pin<Box<dyn Future>>` slot | ||||
| // (and thus we can change the type in the future). | ||||
| #[must_use = "futures do nothing unless polled"] | ||||
| #[pin_project] | ||||
| #[allow(missing_debug_implementations)] | ||||
| pub struct HttpConnecting<R> { | ||||
|     #[pin] | ||||
|     fut: BoxConnecting, | ||||
|     _marker: PhantomData<R>, | ||||
| } | ||||
|  | ||||
| type ConnectResult = Result<(TcpStream, Connected), ConnectError>; | ||||
| type BoxConnecting = Pin<Box<dyn Future<Output = ConnectResult> + Send>>; | ||||
|  | ||||
| impl<R: Resolve> Future for HttpConnecting<R> { | ||||
|     type Output = ConnectResult; | ||||
|  | ||||
|     fn poll(self: Pin<&mut Self>, cx: &mut task::Context<'_>) -> Poll<Self::Output> { | ||||
|         self.project().fut.poll(cx) | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| // Not publicly exported (so missing_docs doesn't trigger). | ||||
| pub struct ConnectError { | ||||
|     msg: Box<str>, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user