@@ -61,7 +61,6 @@ impl Url {
61
61
}
62
62
63
63
impl UserInfo {
64
- #[ inline]
65
64
pub fn new ( user : ~str , pass : Option < ~str > ) -> UserInfo {
66
65
UserInfo { user : user, pass : pass }
67
66
}
@@ -461,14 +460,11 @@ fn get_authority(rawurl: &str) ->
461
460
}
462
461
InHost => {
463
462
pos = i;
463
+ // can't be sure whether this is an ipv6 address or a port
464
464
if input == Unreserved {
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 ;
465
+ return Err ( ~"Illegal characters in authority. ") ;
471
466
}
467
+ st = Ip6Port ;
472
468
}
473
469
Ip6Port => {
474
470
if input == Unreserved {
@@ -518,12 +514,25 @@ fn get_authority(rawurl: &str) ->
518
514
}
519
515
_ => ( )
520
516
}
517
+ end = i;
521
518
}
522
519
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
+
523
528
// finish up
524
529
match st {
525
530
Start => {
526
- host = rawurl. slice ( begin, end) . to_owned ( ) ;
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
+ }
527
536
}
528
537
PassHostPort | Ip6Port => {
529
538
if input != Digit {
@@ -543,7 +552,8 @@ fn get_authority(rawurl: &str) ->
543
552
}
544
553
}
545
554
546
- let rest = rawurl. slice ( end, len) . to_owned ( ) ;
555
+ let rest = if host_is_end_plus_one ( ) { ~"" }
556
+ else { rawurl. slice ( end, len) . to_owned ( ) } ;
547
557
return Ok ( ( userinfo, host, port, rest) ) ;
548
558
}
549
559
@@ -796,17 +806,18 @@ mod tests {
796
806
797
807
#[test]
798
808
fn test_url_parse() {
799
- let url = ~" http
: //user:[email protected] :8080 /doc?s=v#something";
809
+ let url = ~" http
: //user:[email protected] /doc?s=v#something";
800
810
801
811
let up = from_str( url) ;
802
812
let u = up. unwrap( ) ;
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"));
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");
810
821
}
811
822
812
823
#[test]
@@ -817,22 +828,6 @@ mod tests {
817
828
assert!(url.path == ~" /");
818
829
}
819
830
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
-
836
831
#[test]
837
832
fn test_url_with_underscores() {
838
833
let urlstr = ~" http: //dotcom.com/file_name.html";
0 commit comments