Implement ability to disable trust-dns in ClientBuilder.
This commit is contained in:
@@ -31,7 +31,7 @@ use log::debug;
|
||||
use super::request::{Request, RequestBuilder};
|
||||
use super::response::Response;
|
||||
use super::Body;
|
||||
use crate::connect::Connector;
|
||||
use crate::connect::{Connector, HttpConnector};
|
||||
#[cfg(feature = "cookies")]
|
||||
use crate::cookie;
|
||||
use crate::into_url::{expect_uri, try_uri};
|
||||
@@ -91,6 +91,7 @@ struct Config {
|
||||
nodelay: bool,
|
||||
#[cfg(feature = "cookies")]
|
||||
cookie_store: Option<cookie::CookieStore>,
|
||||
trust_dns: bool,
|
||||
error: Option<crate::Error>,
|
||||
}
|
||||
|
||||
@@ -138,6 +139,7 @@ impl ClientBuilder {
|
||||
http2_initial_connection_window_size: None,
|
||||
local_address: None,
|
||||
nodelay: false,
|
||||
trust_dns: cfg!(feature = "trust-dns"),
|
||||
#[cfg(feature = "cookies")]
|
||||
cookie_store: None,
|
||||
},
|
||||
@@ -169,6 +171,14 @@ impl ClientBuilder {
|
||||
headers.get(USER_AGENT).cloned()
|
||||
}
|
||||
|
||||
let http = match config.trust_dns {
|
||||
false => HttpConnector::new_gai(),
|
||||
#[cfg(feature = "trust-dns")]
|
||||
true => HttpConnector::new_trust_dns()?,
|
||||
#[cfg(not(feature = "trust-dns"))]
|
||||
true => unreachable!("trust-dns shouldn't be enabled unless the feature is"),
|
||||
};
|
||||
|
||||
#[cfg(feature = "__tls")]
|
||||
match config.tls {
|
||||
#[cfg(feature = "default-tls")]
|
||||
@@ -195,6 +205,7 @@ impl ClientBuilder {
|
||||
|
||||
|
||||
Connector::new_default_tls(
|
||||
http,
|
||||
tls,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
@@ -205,6 +216,7 @@ impl ClientBuilder {
|
||||
#[cfg(feature = "native-tls")]
|
||||
TlsBackend::BuiltNativeTls(conn) => {
|
||||
Connector::from_built_default_tls(
|
||||
http,
|
||||
conn,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
@@ -214,6 +226,7 @@ impl ClientBuilder {
|
||||
#[cfg(feature = "rustls-tls")]
|
||||
TlsBackend::BuiltRustls(conn) => {
|
||||
Connector::new_rustls_tls(
|
||||
http,
|
||||
conn,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
@@ -247,6 +260,7 @@ impl ClientBuilder {
|
||||
}
|
||||
|
||||
Connector::new_rustls_tls(
|
||||
http,
|
||||
tls,
|
||||
proxies.clone(),
|
||||
user_agent(&config.headers),
|
||||
@@ -266,7 +280,7 @@ impl ClientBuilder {
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "__tls"))]
|
||||
Connector::new(proxies.clone(), config.local_address, config.nodelay)?
|
||||
Connector::new(http, proxies.clone(), config.local_address, config.nodelay)?
|
||||
};
|
||||
|
||||
connector.set_timeout(config.connect_timeout);
|
||||
@@ -793,6 +807,36 @@ impl ClientBuilder {
|
||||
self.config.tls = crate::tls::TlsBackend::UnknownPreconfigured;
|
||||
self
|
||||
}
|
||||
|
||||
/// Enables the [trust-dns](trust_dns_resolver) async resolver instead of a default threadpool using `getaddrinfo`.
|
||||
///
|
||||
/// If the `trust-dns` feature is turned on, the default option is enabled.
|
||||
///
|
||||
/// # Optional
|
||||
///
|
||||
/// This requires the optional `trust-dns` feature to be enabled
|
||||
#[cfg(feature = "trust-dns")]
|
||||
pub fn trust_dns(mut self, enable: bool) -> ClientBuilder {
|
||||
self.config.trust_dns = enable;
|
||||
self
|
||||
}
|
||||
|
||||
/// Disables the trust-dns async resolver.
|
||||
///
|
||||
/// This method exists even if the optional `trust-dns` feature is not enabled.
|
||||
/// This can be used to ensure a `Client` doesn't use the trust-dns async resolver
|
||||
/// even if another dependency were to enable the optional `trust-dns` feature.
|
||||
pub fn no_trust_dns(self) -> ClientBuilder {
|
||||
#[cfg(feature = "trust-dns")]
|
||||
{
|
||||
self.trust_dns(false)
|
||||
}
|
||||
|
||||
#[cfg(not(feature = "trust-dns"))]
|
||||
{
|
||||
self
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type HyperClient = hyper::Client<Connector, super::body::ImplStream>;
|
||||
|
||||
Reference in New Issue
Block a user