@@ -245,28 +245,10 @@ where C: Connect + Sync + 'static,
245245 }
246246 } ;
247247
248- let uri = req. uri ( ) . clone ( ) ;
249- let domain = match ( uri. scheme_part ( ) , uri. authority_part ( ) ) {
250- ( Some ( scheme) , Some ( auth) ) => {
251- format ! ( "{}://{}" , scheme, auth)
252- }
253- ( None , Some ( auth) ) if is_http_connect => {
254- let port = auth. port_part ( ) . unwrap ( ) ;
255- let scheme = match port. as_str ( ) {
256- "443" => {
257- set_scheme ( req. uri_mut ( ) , Scheme :: HTTPS ) ;
258- "https"
259- } ,
260- _ => {
261- set_scheme ( req. uri_mut ( ) , Scheme :: HTTP ) ;
262- "http"
263- } ,
264- } ;
265- format ! ( "{}://{}" , scheme, auth)
266- } ,
267- _ => {
268- debug ! ( "Client requires absolute-form URIs, received: {:?}" , uri) ;
269- return ResponseFuture :: new ( Box :: new ( future:: err ( :: Error :: new_user_absolute_uri_required ( ) ) ) )
248+ let domain = match extract_domain ( req. uri_mut ( ) , is_http_connect) {
249+ Ok ( s) => s,
250+ Err ( err) => {
251+ return ResponseFuture :: new ( Box :: new ( future:: err ( err) ) ) ;
270252 }
271253 } ;
272254
@@ -808,6 +790,33 @@ fn authority_form(uri: &mut Uri) {
808790 } ;
809791}
810792
793+ fn extract_domain ( uri : & mut Uri , is_http_connect : bool ) -> :: Result < String > {
794+ let uri_clone = uri. clone ( ) ;
795+ match ( uri_clone. scheme_part ( ) , uri_clone. authority_part ( ) ) {
796+ ( Some ( scheme) , Some ( auth) ) => {
797+ Ok ( format ! ( "{}://{}" , scheme, auth) )
798+ }
799+ ( None , Some ( auth) ) if is_http_connect => {
800+ let port = auth. port_part ( ) ;
801+ let scheme = match port. as_ref ( ) . map ( |p| p. as_str ( ) ) {
802+ Some ( "443" ) => {
803+ set_scheme ( uri, Scheme :: HTTPS ) ;
804+ "https"
805+ }
806+ _ => {
807+ set_scheme ( uri, Scheme :: HTTP ) ;
808+ "http"
809+ } ,
810+ } ;
811+ Ok ( format ! ( "{}://{}" , scheme, auth) )
812+ } ,
813+ _ => {
814+ debug ! ( "Client requires absolute-form URIs, received: {:?}" , uri) ;
815+ Err ( :: Error :: new_user_absolute_uri_required ( ) )
816+ }
817+ }
818+ }
819+
811820fn set_scheme ( uri : & mut Uri , scheme : Scheme ) {
812821 debug_assert ! ( uri. scheme_part( ) . is_none( ) , "set_scheme expects no existing scheme" ) ;
813822 let old = mem:: replace ( uri, Uri :: default ( ) ) ;
@@ -1089,4 +1098,11 @@ mod unit_tests {
10891098 authority_form ( & mut uri) ;
10901099 assert_eq ! ( uri. to_string( ) , "hyper.rs" ) ;
10911100 }
1101+
1102+ #[ test]
1103+ fn test_extract_domain_connect_no_port ( ) {
1104+ let mut uri = "hyper.rs" . parse ( ) . unwrap ( ) ;
1105+ let domain = extract_domain ( & mut uri, true ) . expect ( "extract domain" ) ;
1106+ assert_eq ! ( domain, "http://hyper.rs" ) ;
1107+ }
10921108}
0 commit comments