diff --git a/src/connector/builder.rs b/src/connector/builder.rs index 3e1abda..02942b2 100644 --- a/src/connector/builder.rs +++ b/src/connector/builder.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use hyper_util::client::legacy::connect::HttpConnector; #[cfg(any(feature = "rustls-native-certs", feature = "webpki-roots"))] use rustls::crypto::CryptoProvider; @@ -44,6 +46,27 @@ impl ConnectorBuilder { /// [`enable_http2`](ConnectorBuilder::enable_http2)) before the /// connector is built. pub fn with_tls_config(self, config: ClientConfig) -> ConnectorBuilder { + assert!( + config.alpn_protocols.is_empty(), + "ALPN protocols should not be pre-defined" + ); + ConnectorBuilder(WantsSchemes { + tls_config: Arc::new(config), + }) + } + + /// Passes an [`Arc`]-shared rustls [`ClientConfig`] to configure the TLS connection + /// + /// The [`alpn_protocols`](ClientConfig::alpn_protocols) field is + /// required to be empty (or the function will panic) and will be + /// rewritten to match the enabled schemes (see + /// [`enable_http1`](ConnectorBuilder::enable_http1), + /// [`enable_http2`](ConnectorBuilder::enable_http2)) before the + /// connector is built. + pub fn with_shared_tls_config( + self, + config: Arc, + ) -> ConnectorBuilder { assert!( config.alpn_protocols.is_empty(), "ALPN protocols should not be pre-defined" @@ -133,7 +156,7 @@ impl Default for ConnectorBuilder { /// State of a builder that needs schemes (https:// and http://) to be /// configured next pub struct WantsSchemes { - tls_config: ClientConfig, + tls_config: Arc, } impl ConnectorBuilder { @@ -166,7 +189,7 @@ impl ConnectorBuilder { /// /// No protocol has been enabled at this point. pub struct WantsProtocols1 { - tls_config: ClientConfig, + tls_config: Arc, https_only: bool, override_server_name: Option, } @@ -176,7 +199,7 @@ impl WantsProtocols1 { HttpsConnector { force_https: self.https_only, http: conn, - tls_config: std::sync::Arc::new(self.tls_config), + tls_config: self.tls_config, override_server_name: self.override_server_name, } }