@@ -42,7 +42,7 @@ pub struct Uri {
42
42
43
43
impl Uri {
44
44
/// Parse a string into a `Uri`.
45
- fn new ( s : ByteStr ) -> Result < Uri , UriError > {
45
+ fn new ( mut s : ByteStr ) -> Result < Uri , UriError > {
46
46
if s. len ( ) == 0 {
47
47
Err ( UriError ( ErrorKind :: Empty ) )
48
48
} else if s. as_bytes ( ) == b"*" {
@@ -81,8 +81,19 @@ impl Uri {
81
81
return Err ( UriError ( ErrorKind :: Malformed ) ) ;
82
82
}
83
83
}
84
+
85
+ // absolute-form must always have a path
86
+ // if there isn't a '/', for consistency, add one.
87
+ let slash = auth_end;
88
+ if s. len ( ) == slash {
89
+ s. insert ( slash, '/' ) ;
90
+ } else if s. as_bytes ( ) [ slash] != b'/' {
91
+ s. insert ( slash, '/' ) ;
92
+ }
93
+
84
94
let query = parse_query ( & s) ;
85
95
let fragment = parse_fragment ( & s) ;
96
+
86
97
Ok ( Uri {
87
98
source : s,
88
99
scheme_end : scheme,
@@ -443,7 +454,6 @@ macro_rules! test_parse {
443
454
#[ test]
444
455
fn $test_name( ) {
445
456
let uri = Uri :: from_str( $str) . unwrap( ) ;
446
- println!( "{:?} = {:#?}" , $str, uri) ;
447
457
$(
448
458
assert_eq!( uri. $method( ) , $value, stringify!( $method) ) ;
449
459
) +
@@ -486,6 +496,8 @@ test_parse! {
486
496
query = None ,
487
497
fragment = None ,
488
498
port = Some ( 61761 ) ,
499
+
500
+ to_string = "https://127.0.0.1:61761/" ,
489
501
}
490
502
491
503
test_parse ! {
@@ -497,6 +509,8 @@ test_parse! {
497
509
path = "*" ,
498
510
query = None ,
499
511
fragment = None ,
512
+
513
+ to_string = "*" ,
500
514
}
501
515
502
516
test_parse ! {
@@ -510,6 +524,8 @@ test_parse! {
510
524
query = None ,
511
525
fragment = None ,
512
526
port = None ,
527
+
528
+ to_string = "localhost" ,
513
529
}
514
530
515
531
test_parse ! {
@@ -627,6 +643,8 @@ test_parse! {
627
643
query = Some ( "foo=bar" ) ,
628
644
fragment = None ,
629
645
port = None ,
646
+
647
+ to_string = "http://127.0.0.1/?foo=bar" ,
630
648
}
631
649
632
650
test_parse ! {
@@ -651,6 +669,8 @@ test_parse! {
651
669
query = None ,
652
670
fragment = Some ( "foo?bar" ) ,
653
671
port = None ,
672
+
673
+ to_string = "http://127.0.0.1/#foo?bar" ,
654
674
}
655
675
656
676
#[ test]
0 commit comments