From 2e06108f7098bd238396a2d1f5ddd77ac0f6512a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Fri, 21 Feb 2020 12:41:13 -0800 Subject: [PATCH] Require the native-tls feature to supply a preconfigured tls (#814) --- src/async_impl/client.rs | 29 ++++++++++++++++++++++------- src/blocking/client.rs | 14 +++++++++++++- src/connect.rs | 19 ++++++------------- src/tls.rs | 16 ++++++++++++---- tests/client.rs | 4 ++-- 5 files changed, 55 insertions(+), 27 deletions(-) diff --git a/src/async_impl/client.rs b/src/async_impl/client.rs index 5cf3546..9383565 100644 --- a/src/async_impl/client.rs +++ b/src/async_impl/client.rs @@ -1,4 +1,7 @@ -#[cfg(feature = "__tls")] +#[cfg(any( + feature = "native-tls", + feature = "rustls-tls", +))] use std::any::Any; use std::convert::TryInto; use std::net::IpAddr; @@ -199,9 +202,9 @@ impl ClientBuilder { config.nodelay, )? }, - #[cfg(feature = "default-tls")] - TlsBackend::BuiltDefault(conn) => { - Connector::from_built_default( + #[cfg(feature = "native-tls")] + TlsBackend::BuiltNativeTls(conn) => { + Connector::from_built_default_tls( conn, proxies.clone(), user_agent(&config.headers), @@ -251,6 +254,10 @@ impl ClientBuilder { config.nodelay, )? }, + #[cfg(any( + feature = "native-tls", + feature = "rustls-tls", + ))] TlsBackend::UnknownPreconfigured => { return Err(crate::error::builder( "Unknown TLS backend passed to `use_preconfigured_tls`" @@ -742,14 +749,22 @@ impl ClientBuilder { /// /// If the passed `Any` argument is not a TLS backend that reqwest /// understands, the `ClientBuilder` will error when calling `build`. - #[cfg(feature = "__tls")] + /// + /// # Optional + /// + /// This requires one of the optional features `native-tls` or + /// `rustls-tls` to be enabled. + #[cfg(any( + feature = "native-tls", + feature = "rustls-tls", + ))] pub fn use_preconfigured_tls(mut self, tls: impl Any) -> ClientBuilder { let mut tls = Some(tls); - #[cfg(feature = "default-tls")] + #[cfg(feature = "native-tls")] { if let Some(conn) = (&mut tls as &mut dyn Any).downcast_mut::>() { let tls = conn.take().expect("is definitely Some"); - let tls = crate::tls::TlsBackend::BuiltDefault(tls); + let tls = crate::tls::TlsBackend::BuiltNativeTls(tls); self.config.tls = tls; return self; } diff --git a/src/blocking/client.rs b/src/blocking/client.rs index abe9606..9e276c3 100644 --- a/src/blocking/client.rs +++ b/src/blocking/client.rs @@ -1,3 +1,7 @@ +#[cfg(any( + feature = "native-tls", + feature = "rustls-tls", +))] use std::any::Any; use std::convert::TryInto; use std::fmt; @@ -455,7 +459,15 @@ impl ClientBuilder { /// /// If the passed `Any` argument is not a TLS backend that reqwest /// understands, the `ClientBuilder` will error when calling `build`. - #[cfg(feature = "__tls")] + /// + /// # Optional + /// + /// This requires one of the optional features `native-tls` or + /// `rustls-tls` to be enabled. + #[cfg(any( + feature = "native-tls", + feature = "rustls-tls", + ))] pub fn use_preconfigured_tls(self, tls: impl Any) -> ClientBuilder { self.with_inner(move |inner| inner.use_preconfigured_tls(tls)) } diff --git a/src/connect.rs b/src/connect.rs index 6109e45..a6557d7 100644 --- a/src/connect.rs +++ b/src/connect.rs @@ -92,23 +92,17 @@ impl Connector { T: Into>, { let tls = tls.build().map_err(crate::error::builder)?; - - let mut http = http_connector()?; - http.set_local_address(local_addr.into()); - http.enforce_http(false); - - Ok(Connector { - inner: Inner::DefaultTls(http, tls), + Self::from_built_default_tls( + tls, proxies, - verbose: verbose::OFF, - timeout: None, - nodelay, user_agent, - }) + local_addr, + nodelay, + ) } #[cfg(feature = "default-tls")] - pub(crate) fn from_built_default ( + pub(crate) fn from_built_default_tls ( tls: TlsConnector, proxies: Arc>, user_agent: Option, @@ -117,7 +111,6 @@ impl Connector { where T: Into>, { - let mut http = http_connector()?; http.set_local_address(local_addr.into()); http.enforce_http(false); diff --git a/src/tls.rs b/src/tls.rs index cdcbe9c..90ee494 100644 --- a/src/tls.rs +++ b/src/tls.rs @@ -269,12 +269,16 @@ impl fmt::Debug for Identity { pub(crate) enum TlsBackend { #[cfg(feature = "default-tls")] Default, - #[cfg(feature = "default-tls")] - BuiltDefault(native_tls_crate::TlsConnector), + #[cfg(feature = "native-tls")] + BuiltNativeTls(native_tls_crate::TlsConnector), #[cfg(feature = "rustls-tls")] Rustls, #[cfg(feature = "rustls-tls")] BuiltRustls(rustls::ClientConfig), + #[cfg(any( + feature = "native-tls", + feature = "rustls-tls", + ))] UnknownPreconfigured, } @@ -283,12 +287,16 @@ impl fmt::Debug for TlsBackend { match self { #[cfg(feature = "default-tls")] TlsBackend::Default => write!(f, "Default"), - #[cfg(feature = "default-tls")] - TlsBackend::BuiltDefault(_) => write!(f, "BuiltDefault"), + #[cfg(feature = "native-tls")] + TlsBackend::BuiltNativeTls(_) => write!(f, "BuiltNativeTls"), #[cfg(feature = "rustls-tls")] TlsBackend::Rustls => write!(f, "Rustls"), #[cfg(feature = "rustls-tls")] TlsBackend::BuiltRustls(_) => write!(f, "BuiltRustls"), + #[cfg(any( + feature = "native-tls", + feature = "rustls-tls", + ))] TlsBackend::UnknownPreconfigured => write!(f, "UnknownPreconfigured"), } } diff --git a/tests/client.rs b/tests/client.rs index 7ac73a4..3105d4f 100644 --- a/tests/client.rs +++ b/tests/client.rs @@ -134,7 +134,7 @@ async fn body_pipe_response() { assert_eq!(res2.status(), reqwest::StatusCode::OK); } -#[cfg(feature = "__tls")] +#[cfg(any(feature = "native-tls", feature = "rustls-tls",))] #[test] fn use_preconfigured_tls_with_bogus_backend() { struct DefinitelyNotTls; @@ -145,7 +145,7 @@ fn use_preconfigured_tls_with_bogus_backend() { .expect_err("definitely is not TLS"); } -#[cfg(feature = "default-tls")] +#[cfg(feature = "native-tls")] #[test] fn use_preconfigured_native_tls_default() { extern crate native_tls_crate;