@@ -330,6 +330,7 @@ where {
330330 interface : Option < & str > ,
331331 nodelay : bool ,
332332 tls_info : bool ,
333+ server_name_resolver : Arc < dyn hyper_rustls:: ResolveServerName + Send + Sync > ,
333334 ) -> ConnectorBuilder
334335 where
335336 T : Into < Option < IpAddr > > ,
@@ -367,6 +368,7 @@ where {
367368 http,
368369 tls,
369370 tls_proxy,
371+ server_name_resolver,
370372 } ,
371373 proxies,
372374 verbose : verbose:: OFF ,
@@ -458,6 +460,7 @@ enum Inner {
458460 http : HttpConnector ,
459461 tls : Arc < rustls:: ClientConfig > ,
460462 tls_proxy : Arc < rustls:: ClientConfig > ,
463+ server_name_resolver : Arc < dyn hyper_rustls:: ResolveServerName + Send + Sync > ,
461464 } ,
462465}
463466
@@ -579,7 +582,7 @@ impl ConnectorService {
579582 }
580583 }
581584 #[ cfg( feature = "__rustls" ) ]
582- Inner :: RustlsTls { http, tls, .. } => {
585+ Inner :: RustlsTls { http, tls, server_name_resolver , .. } => {
583586 let mut http = http. clone ( ) ;
584587
585588 // Disable Nagle's algorithm for TLS handshake
@@ -589,7 +592,7 @@ impl ConnectorService {
589592 http. set_nodelay ( true ) ;
590593 }
591594
592- let mut http = hyper_rustls:: HttpsConnector :: from ( ( http, tls. clone ( ) ) ) ;
595+ let mut http = hyper_rustls:: HttpsConnector :: from ( ( http, tls. clone ( ) , server_name_resolver ) ) ;
593596 let io = http. call ( dst) . await ?;
594597
595598 if let hyper_rustls:: MaybeHttpsStream :: Https ( stream) = io {
@@ -675,10 +678,9 @@ impl ConnectorService {
675678 http,
676679 tls,
677680 tls_proxy,
681+ server_name_resolver : name_resolver,
678682 } => {
679683 if dst. scheme ( ) == Some ( & Scheme :: HTTPS ) {
680- use rustls_pki_types:: ServerName ;
681- use std:: convert:: TryFrom ;
682684 use tokio_rustls:: TlsConnector as RustlsConnector ;
683685
684686 log:: trace!( "tunneling HTTPS over proxy" ) ;
@@ -701,9 +703,8 @@ impl ConnectorService {
701703 // We don't wrap this again in an HttpsConnector since that uses Maybe,
702704 // and we know this is definitely HTTPS.
703705 let tunneled = tunnel. call ( dst. clone ( ) ) . await ?;
704- let host = dst. host ( ) . ok_or ( "no host in url" ) ?. to_string ( ) ;
705- let server_name = ServerName :: try_from ( host. as_str ( ) . to_owned ( ) )
706- . map_err ( |_| "Invalid Server Name" ) ?;
706+
707+ let server_name = name_resolver. resolve ( & dst) ?;
707708 let io = RustlsConnector :: from ( tls. clone ( ) )
708709 . connect ( server_name, TokioIo :: new ( tunneled) )
709710 . await ?;
0 commit comments