@@ -6,7 +6,7 @@ use std::time::Duration;
6
6
use futures_channel:: oneshot;
7
7
use futures_util:: future:: { self , Either , FutureExt as _, TryFutureExt as _} ;
8
8
use http:: header:: { HeaderValue , HOST } ;
9
- use http:: uri:: Scheme ;
9
+ use http:: uri:: { Port , Scheme } ;
10
10
use http:: { Method , Request , Response , Uri , Version } ;
11
11
12
12
use super :: conn;
@@ -231,7 +231,7 @@ where
231
231
let uri = req. uri ( ) . clone ( ) ;
232
232
req. headers_mut ( ) . entry ( HOST ) . or_insert_with ( || {
233
233
let hostname = uri. host ( ) . expect ( "authority implies host" ) ;
234
- if let Some ( port) = uri . port ( ) {
234
+ if let Some ( port) = get_non_default_port ( & uri ) {
235
235
let s = format ! ( "{}:{}" , hostname, port) ;
236
236
HeaderValue :: from_str ( & s)
237
237
} else {
@@ -820,6 +820,20 @@ fn set_scheme(uri: &mut Uri, scheme: Scheme) {
820
820
* uri = Uri :: from_parts ( parts) . expect ( "scheme is valid" ) ;
821
821
}
822
822
823
+ fn get_non_default_port ( uri : & Uri ) -> Option < Port < & str > > {
824
+ match ( uri. port ( ) . map ( |p| p. as_u16 ( ) ) , is_schema_secure ( uri) ) {
825
+ ( Some ( 443 ) , true ) => None ,
826
+ ( Some ( 80 ) , false ) => None ,
827
+ _ => uri. port ( ) ,
828
+ }
829
+ }
830
+
831
+ fn is_schema_secure ( uri : & Uri ) -> bool {
832
+ uri. scheme_str ( )
833
+ . map ( |scheme_str| matches ! ( scheme_str, "wss" | "https" ) )
834
+ . unwrap_or_default ( )
835
+ }
836
+
823
837
/// A builder to configure a new [`Client`](Client).
824
838
///
825
839
/// # Example
@@ -1221,4 +1235,48 @@ mod unit_tests {
1221
1235
assert_eq ! ( scheme, * "http" ) ;
1222
1236
assert_eq ! ( host, "hyper.rs" ) ;
1223
1237
}
1238
+
1239
+ #[ test]
1240
+ fn test_is_secure ( ) {
1241
+ assert_eq ! (
1242
+ is_schema_secure( & "http://hyper.rs" . parse:: <Uri >( ) . unwrap( ) ) ,
1243
+ false
1244
+ ) ;
1245
+ assert_eq ! ( is_schema_secure( & "hyper.rs" . parse:: <Uri >( ) . unwrap( ) ) , false ) ;
1246
+ assert_eq ! (
1247
+ is_schema_secure( & "wss://hyper.rs" . parse:: <Uri >( ) . unwrap( ) ) ,
1248
+ true
1249
+ ) ;
1250
+ assert_eq ! (
1251
+ is_schema_secure( & "ws://hyper.rs" . parse:: <Uri >( ) . unwrap( ) ) ,
1252
+ false
1253
+ ) ;
1254
+ }
1255
+
1256
+ #[ test]
1257
+ fn test_get_non_default_port ( ) {
1258
+ assert ! ( get_non_default_port( & "http://hyper.rs" . parse:: <Uri >( ) . unwrap( ) ) . is_none( ) ) ;
1259
+ assert ! ( get_non_default_port( & "http://hyper.rs:80" . parse:: <Uri >( ) . unwrap( ) ) . is_none( ) ) ;
1260
+ assert ! ( get_non_default_port( & "https://hyper.rs:443" . parse:: <Uri >( ) . unwrap( ) ) . is_none( ) ) ;
1261
+ assert ! ( get_non_default_port( & "hyper.rs:80" . parse:: <Uri >( ) . unwrap( ) ) . is_none( ) ) ;
1262
+
1263
+ assert_eq ! (
1264
+ get_non_default_port( & "http://hyper.rs:123" . parse:: <Uri >( ) . unwrap( ) )
1265
+ . unwrap( )
1266
+ . as_u16( ) ,
1267
+ 123
1268
+ ) ;
1269
+ assert_eq ! (
1270
+ get_non_default_port( & "https://hyper.rs:80" . parse:: <Uri >( ) . unwrap( ) )
1271
+ . unwrap( )
1272
+ . as_u16( ) ,
1273
+ 80
1274
+ ) ;
1275
+ assert_eq ! (
1276
+ get_non_default_port( & "hyper.rs:123" . parse:: <Uri >( ) . unwrap( ) )
1277
+ . unwrap( )
1278
+ . as_u16( ) ,
1279
+ 123
1280
+ ) ;
1281
+ }
1224
1282
}
0 commit comments