Skip to content

Commit f51d30d

Browse files
committed
auto merge of #8616 : kballard/rust/url-parse-errors, r=catamorphism
Fixes issue #8612.
2 parents f113249 + 4d97b6e commit f51d30d

File tree

1 file changed

+33
-28
lines changed

1 file changed

+33
-28
lines changed

src/libextra/url.rs

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ impl Url {
6161
}
6262

6363
impl UserInfo {
64+
#[inline]
6465
pub fn new(user: ~str, pass: Option<~str>) -> UserInfo {
6566
UserInfo { user: user, pass: pass }
6667
}
@@ -460,11 +461,14 @@ fn get_authority(rawurl: &str) ->
460461
}
461462
InHost => {
462463
pos = i;
463-
// can't be sure whether this is an ipv6 address or a port
464464
if input == Unreserved {
465-
return Err(~"Illegal characters in authority.");
465+
// must be port
466+
host = rawurl.slice(begin, i).to_owned();
467+
st = InPort;
468+
} else {
469+
// can't be sure whether this is an ipv6 address or a port
470+
st = Ip6Port;
466471
}
467-
st = Ip6Port;
468472
}
469473
Ip6Port => {
470474
if input == Unreserved {
@@ -514,25 +518,12 @@ fn get_authority(rawurl: &str) ->
514518
}
515519
_ => ()
516520
}
517-
end = i;
518521
}
519522

520-
let end = end; // make end immutable so it can be captured
521-
522-
let host_is_end_plus_one: &fn() -> bool = || {
523-
let xs = ['?', '#', '/'];
524-
end+1 == len
525-
&& !xs.iter().any(|x| *x == (rawurl[end] as char))
526-
};
527-
528523
// finish up
529524
match st {
530525
Start => {
531-
if host_is_end_plus_one() {
532-
host = rawurl.slice(begin, end+1).to_owned();
533-
} else {
534-
host = rawurl.slice(begin, end).to_owned();
535-
}
526+
host = rawurl.slice(begin, end).to_owned();
536527
}
537528
PassHostPort | Ip6Port => {
538529
if input != Digit {
@@ -552,8 +543,7 @@ fn get_authority(rawurl: &str) ->
552543
}
553544
}
554545

555-
let rest = if host_is_end_plus_one() { ~"" }
556-
else { rawurl.slice(end, len).to_owned() };
546+
let rest = rawurl.slice(end, len).to_owned();
557547
return Ok((userinfo, host, port, rest));
558548
}
559549

@@ -806,18 +796,17 @@ mod tests {
806796
807797
#[test]
808798
fn test_url_parse() {
809-
let url = ~"http://user:[email protected]/doc?s=v#something";
799+
let url = ~"http://user:[email protected]:8080/doc?s=v#something";
810800

811801
let up = from_str(url);
812802
let u = up.unwrap();
813-
assert!(u.scheme == ~"http");
814-
let userinfo = u.user.get_ref();
815-
assert!(userinfo.user == ~"user");
816-
assert!(userinfo.pass.get_ref() == &~"pass");
817-
assert!(u.host == ~"rust-lang.org");
818-
assert!(u.path == ~"/doc");
819-
assert!(u.query == ~[(~"s", ~"v")]);
820-
assert!(u.fragment.get_ref() == &~"something");
803+
assert_eq!(&u.scheme, &~"http");
804+
assert_eq!(&u.user, &Some(UserInfo::new(~"user", Some(~"pass"))));
805+
assert_eq!(&u.host, &~"rust-lang.org");
806+
assert_eq!(&u.port, &Some(~"8080"));
807+
assert_eq!(&u.path, &~"/doc");
808+
assert_eq!(&u.query, &~[(~"s", ~"v")]);
809+
assert_eq!(&u.fragment, &Some(~"something"));
821810
}
822811
823812
#[test]
@@ -828,6 +817,22 @@ mod tests {
828817
assert!(url.path == ~"/");
829818
}
830819
820+
#[test]
821+
fn test_url_host_with_port() {
822+
let urlstr = ~"scheme://host:1234";
823+
let url = from_str(urlstr).unwrap();
824+
assert_eq!(&url.scheme, &~"scheme");
825+
assert_eq!(&url.host, &~"host");
826+
assert_eq!(&url.port, &Some(~"1234"));
827+
assert_eq!(&url.path, &~""); // is empty path really correct? Other tests think so
828+
let urlstr = ~"scheme://host:1234/";
829+
let url = from_str(urlstr).unwrap();
830+
assert_eq!(&url.scheme, &~"scheme");
831+
assert_eq!(&url.host, &~"host");
832+
assert_eq!(&url.port, &Some(~"1234"));
833+
assert_eq!(&url.path, &~"/");
834+
}
835+
831836
#[test]
832837
fn test_url_with_underscores() {
833838
let urlstr = ~"http://dotcom.com/file_name.html";

0 commit comments

Comments
 (0)