Skip to content

Commit d16b2c3

Browse files
committed
fix(client): fix panic when CONNECT request doesn't have a port
1 parent 3e9782c commit d16b2c3

File tree

1 file changed

+38
-22
lines changed

1 file changed

+38
-22
lines changed

src/client/mod.rs

+38-22
Original file line numberDiff line numberDiff line change
@@ -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+
811820
fn 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

Comments
 (0)