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