@@ -489,10 +489,17 @@ fn get_authority(rawurl: ~str) ->
489
489
end = i;
490
490
}
491
491
492
+ let end = end; // make end immutable so it can be captured
493
+
494
+ let host_is_end_plus_one = || {
495
+ end+1 == len
496
+ && !['?', '#', '/'].contains(rawurl[end] as char)
497
+ };
498
+
492
499
// finish up
493
500
match st {
494
501
start {
495
- if end+1 == len {
502
+ if host_is_end_plus_one() {
496
503
host = str::slice(rawurl, begin, end+1);
497
504
} else {
498
505
host = str::slice(rawurl, begin, end);
@@ -516,7 +523,7 @@ fn get_authority(rawurl: ~str) ->
516
523
}
517
524
}
518
525
519
- let rest = if end+1 == len { ~" " }
526
+ let rest = if host_is_end_plus_one() { ~" " }
520
527
else { str::slice(rawurl, end, len) };
521
528
return result::ok((userinfo, host, port, rest));
522
529
}
@@ -779,6 +786,15 @@ mod tests {
779
786
assert option::unwrap(copy u.fragment) == ~" something";
780
787
}
781
788
789
+ #[test]
790
+ fn test_url_parse_host_slash() {
791
+ let urlstr = ~" http: //0.42.42.42/";
792
+ let url = from_str( urlstr) . get( ) ;
793
+ #debug( "url: %?" , url) ;
794
+ assert url. host == ~"0.42 . 42.42 ";
795
+ assert url.path == ~" /";
796
+ }
797
+
782
798
#[test]
783
799
fn test_no_scheme() {
784
800
assert result::is_err(get_scheme(~" noschemehere. html"));
0 commit comments