add ability to create a client with own tls connector (#809)
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
#[cfg(feature = "__tls")]
|
||||
use std::any::Any;
|
||||
use std::convert::TryInto;
|
||||
use std::net::IpAddr;
|
||||
use std::sync::Arc;
|
||||
@@ -188,6 +190,7 @@ impl ClientBuilder {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Connector::new_default_tls(
|
||||
tls,
|
||||
proxies.clone(),
|
||||
@@ -195,7 +198,25 @@ impl ClientBuilder {
|
||||
config.local_address,
|
||||
config.nodelay,
|
||||
)?
|
||||
}
|
||||
},
|
||||
#[cfg(feature = "default-tls")]
|
||||
TlsBackend::BuiltDefault(conn) => {
|
||||
Connector::from_built_default(
|
||||
conn,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
config.local_address,
|
||||
config.nodelay)?
|
||||
},
|
||||
#[cfg(feature = "rustls-tls")]
|
||||
TlsBackend::BuiltRustls(conn) => {
|
||||
Connector::new_rustls_tls(
|
||||
conn,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
config.local_address,
|
||||
config.nodelay)?
|
||||
},
|
||||
#[cfg(feature = "rustls-tls")]
|
||||
TlsBackend::Rustls => {
|
||||
use crate::tls::NoVerifier;
|
||||
@@ -229,7 +250,12 @@ impl ClientBuilder {
|
||||
config.local_address,
|
||||
config.nodelay,
|
||||
)?
|
||||
}
|
||||
},
|
||||
TlsBackend::UnknownPreconfigured => {
|
||||
return Err(crate::error::builder(
|
||||
"Unknown TLS backend passed to `use_preconfigured_tls`"
|
||||
));
|
||||
},
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "__tls"))]
|
||||
@@ -711,6 +737,38 @@ impl ClientBuilder {
|
||||
self.config.tls = TlsBackend::Rustls;
|
||||
self
|
||||
}
|
||||
|
||||
/// Use a preconfigured TLS backend.
|
||||
///
|
||||
/// If the passed `Any` argument is not a TLS backend that reqwest
|
||||
/// understands, the `ClientBuilder` will error when calling `build`.
|
||||
#[cfg(feature = "__tls")]
|
||||
pub fn use_preconfigured_tls(mut self, tls: impl Any) -> ClientBuilder {
|
||||
let mut tls = Some(tls);
|
||||
#[cfg(feature = "default-tls")]
|
||||
{
|
||||
if let Some(conn) = (&mut tls as &mut dyn Any).downcast_mut::<Option<native_tls_crate::TlsConnector>>() {
|
||||
let tls = conn.take().expect("is definitely Some");
|
||||
let tls = crate::tls::TlsBackend::BuiltDefault(tls);
|
||||
self.config.tls = tls;
|
||||
return self;
|
||||
}
|
||||
}
|
||||
#[cfg(feature = "rustls-tls")]
|
||||
{
|
||||
if let Some(conn) = (&mut tls as &mut dyn Any).downcast_mut::<Option<rustls::ClientConfig>>() {
|
||||
|
||||
let tls = conn.take().expect("is definitely Some");
|
||||
let tls = crate::tls::TlsBackend::BuiltRustls(tls);
|
||||
self.config.tls = tls;
|
||||
return self;
|
||||
}
|
||||
}
|
||||
|
||||
// Otherwise, we don't recognize the TLS backend!
|
||||
self.config.tls = crate::tls::TlsBackend::UnknownPreconfigured;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
type HyperClient = hyper::Client<Connector, super::body::ImplStream>;
|
||||
|
||||
Reference in New Issue
Block a user