@@ -136,7 +136,15 @@ impl ClientTlsConfig {
136136 pub ( crate ) fn into_tls_connector ( self , uri : & Uri ) -> Result < TlsConnector , crate :: BoxError > {
137137 let domain = match & self . domain {
138138 Some ( domain) => domain,
139- None => uri. host ( ) . ok_or_else ( Error :: new_invalid_uri) ?,
139+ None => {
140+ let host = uri. host ( ) . ok_or_else ( Error :: new_invalid_uri) ?;
141+ // host() returns the host including brackets if it's an IPv6 address
142+ if host. starts_with ( '[' ) && host. ends_with ( ']' ) {
143+ & host[ 1 ..host. len ( ) -1 ]
144+ } else {
145+ host
146+ }
147+ } ,
140148 } ;
141149 TlsConnector :: new (
142150 self . certs ,
@@ -153,3 +161,39 @@ impl ClientTlsConfig {
153161 )
154162 }
155163}
164+
165+ #[ cfg( test) ]
166+ mod tests {
167+ use super :: * ;
168+
169+ #[ test]
170+ fn test_into_tls_connector_with_ipv4 ( ) {
171+ let config = ClientTlsConfig :: new ( ) ;
172+ let uri = "https://192.168.1.1:443" . parse :: < Uri > ( ) . unwrap ( ) ;
173+ config. into_tls_connector ( & uri) . unwrap ( ) ;
174+ }
175+
176+ #[ test]
177+ fn test_into_tls_connector_with_ipv6_ ( ) {
178+ let config = ClientTlsConfig :: new ( ) ;
179+ let uri = "https://[::1]:443" . parse :: < Uri > ( ) . unwrap ( ) ;
180+
181+ config. into_tls_connector ( & uri) . unwrap ( ) ;
182+ }
183+
184+ #[ test]
185+ fn test_into_tls_connector_with_domain_name ( ) {
186+ let config = ClientTlsConfig :: new ( ) ;
187+ let uri = "https://example.com:443" . parse :: < Uri > ( ) . unwrap ( ) ;
188+
189+ config. into_tls_connector ( & uri) . unwrap ( ) ;
190+ }
191+
192+ #[ test]
193+ fn test_into_tls_connector_with_explicit_domain ( ) {
194+ let config = ClientTlsConfig :: new ( ) . domain_name ( "example.com" ) ;
195+ let uri = "https://[2001:db8::1]:443" . parse :: < Uri > ( ) . unwrap ( ) ;
196+
197+ config. into_tls_connector ( & uri) . unwrap ( ) ;
198+ }
199+ }
0 commit comments