1+ use std:: sync:: Arc ;
2+
13use hyper_util:: client:: legacy:: connect:: HttpConnector ;
24#[ cfg( any( feature = "rustls-native-certs" , feature = "webpki-roots" ) ) ]
35use rustls:: crypto:: CryptoProvider ;
46use rustls:: ClientConfig ;
57
6- use super :: HttpsConnector ;
8+ use super :: { DefaultServerNameResolver , HttpsConnector , ResolveServerName } ;
79#[ cfg( any( feature = "rustls-native-certs" , feature = "webpki-roots" ) ) ]
810use crate :: config:: ConfigBuilderExt ;
11+ use pki_types:: ServerName ;
912
1013/// A builder for an [`HttpsConnector`]
1114///
@@ -153,7 +156,7 @@ impl ConnectorBuilder<WantsSchemes> {
153156 ConnectorBuilder ( WantsProtocols1 {
154157 tls_config : self . 0 . tls_config ,
155158 https_only : true ,
156- override_server_name : None ,
159+ server_name_resolver : None ,
157160 } )
158161 }
159162
@@ -165,7 +168,7 @@ impl ConnectorBuilder<WantsSchemes> {
165168 ConnectorBuilder ( WantsProtocols1 {
166169 tls_config : self . 0 . tls_config ,
167170 https_only : false ,
168- override_server_name : None ,
171+ server_name_resolver : None ,
169172 } )
170173 }
171174}
@@ -177,7 +180,7 @@ impl ConnectorBuilder<WantsSchemes> {
177180pub struct WantsProtocols1 {
178181 tls_config : ClientConfig ,
179182 https_only : bool ,
180- override_server_name : Option < String > ,
183+ server_name_resolver : Option < Arc < dyn ResolveServerName + Sync + Send > > ,
181184}
182185
183186impl WantsProtocols1 {
@@ -186,7 +189,9 @@ impl WantsProtocols1 {
186189 force_https : self . https_only ,
187190 http : conn,
188191 tls_config : std:: sync:: Arc :: new ( self . tls_config ) ,
189- override_server_name : self . override_server_name ,
192+ server_name_resolver : self
193+ . server_name_resolver
194+ . unwrap_or_else ( || Arc :: new ( DefaultServerNameResolver :: default ( ) ) ) ,
190195 }
191196 }
192197
@@ -237,6 +242,22 @@ impl ConnectorBuilder<WantsProtocols1> {
237242 } )
238243 }
239244
245+ /// Override server name for the TLS stack
246+ ///
247+ /// By default, for each connection hyper-rustls will extract host portion
248+ /// of the destination URL and verify that server certificate contains
249+ /// this value.
250+ ///
251+ /// If this method is called, hyper-rustls will instead use this resolver
252+ /// to compute the value used to verify the server certificate.
253+ pub fn with_server_name_resolver (
254+ mut self ,
255+ resolver : impl ResolveServerName + ' static + Sync + Send ,
256+ ) -> Self {
257+ self . 0 . server_name_resolver = Some ( Arc :: new ( resolver) ) ;
258+ self
259+ }
260+
240261 /// Override server name for the TLS stack
241262 ///
242263 /// By default, for each connection hyper-rustls will extract host portion
@@ -246,9 +267,22 @@ impl ConnectorBuilder<WantsProtocols1> {
246267 /// If this method is called, hyper-rustls will instead verify that server
247268 /// certificate contains `override_server_name`. Domain name included in
248269 /// the URL will not affect certificate validation.
249- pub fn with_server_name ( mut self , override_server_name : String ) -> Self {
250- self . 0 . override_server_name = Some ( override_server_name) ;
251- self
270+ #[ deprecated(
271+ since = "0.27.1" ,
272+ note = "use Self::with_server_name_resolver with FixedServerNameResolver instead"
273+ ) ]
274+ pub fn with_server_name ( self , mut override_server_name : String ) -> Self {
275+ // remove square brackets around IPv6 address.
276+ if let Some ( trimmed) = override_server_name
277+ . strip_prefix ( '[' )
278+ . and_then ( |s| s. strip_suffix ( ']' ) )
279+ {
280+ override_server_name = trimmed. to_string ( ) ;
281+ }
282+
283+ self . with_server_name_resolver ( move |_: & _ | {
284+ ServerName :: try_from ( override_server_name. clone ( ) )
285+ } )
252286 }
253287}
254288
0 commit comments