1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
use super::io::BoxedIo; #[cfg(feature = "tls")] use super::tls::TlsConnector; use http::Uri; use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; use tower_make::MakeConnection; use tower_service::Service; #[cfg(not(feature = "tls"))] pub(crate) fn connector<C>(inner: C) -> Connector<C> { Connector::new(inner) } #[cfg(feature = "tls")] pub(crate) fn connector<C>(inner: C, tls: Option<TlsConnector>) -> Connector<C> { Connector::new(inner, tls) } pub(crate) struct Connector<C> { inner: C, #[cfg(feature = "tls")] tls: Option<TlsConnector>, #[cfg(not(feature = "tls"))] #[allow(dead_code)] tls: Option<()>, } impl<C> Connector<C> { #[cfg(not(feature = "tls"))] pub(crate) fn new(inner: C) -> Self { Self { inner, tls: None } } #[cfg(feature = "tls")] fn new(inner: C, tls: Option<TlsConnector>) -> Self { Self { inner, tls } } } impl<C> Service<Uri> for Connector<C> where C: MakeConnection<Uri>, C::Connection: Unpin + Send + 'static, C::Future: Send + 'static, crate::Error: From<C::Error> + Send + 'static, { type Response = BoxedIo; type Error = crate::Error; type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + 'static>>; fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> { MakeConnection::poll_ready(&mut self.inner, cx).map_err(Into::into) } fn call(&mut self, uri: Uri) -> Self::Future { let connect = self.inner.make_connection(uri); #[cfg(feature = "tls")] let tls = self.tls.clone(); Box::pin(async move { let io = connect.await?; #[cfg(feature = "tls")] { if let Some(tls) = tls { let conn = tls.connect(io).await?; return Ok(BoxedIo::new(conn)); } } Ok(BoxedIo::new(io)) }) } }