@@ -54,22 +54,16 @@ pub struct Url {
54
54
pub host : String ,
55
55
/// A TCP port number, for example `8080`.
56
56
pub port : Option < String > ,
57
- /// The path component of a URL, for example `/foo/bar`.
58
- pub path : String ,
59
- /// The query component of a URL.
60
- /// `vec!(("baz".to_string(), "qux".to_string()))` represents the fragment
61
- /// `baz=qux` in the above example.
62
- pub query : Query ,
63
- /// The fragment component, such as `quz`. Not including the leading `#` character.
64
- pub fragment : Option < String >
57
+ /// The path component of a URL, for example `/foo/bar?baz=qux#quz`.
58
+ pub path : Path ,
65
59
}
66
60
67
- #[ deriving( Clone , PartialEq ) ]
61
+ #[ deriving( Clone , PartialEq , Eq ) ]
68
62
pub struct Path {
69
63
/// The path component of a URL, for example `/foo/bar`.
70
64
pub path : String ,
71
65
/// The query component of a URL.
72
- /// `vec!(( "baz".to_string(), "qux".to_string())) ` represents the fragment
66
+ /// `vec![( "baz".to_string(), "qux".to_string())] ` represents the fragment
73
67
/// `baz=qux` in the above example.
74
68
pub query : Query ,
75
69
/// The fragment component, such as `quz`. Not including the leading `#` character.
@@ -102,9 +96,7 @@ impl Url {
102
96
user : user,
103
97
host : host,
104
98
port : port,
105
- path : path,
106
- query : query,
107
- fragment : fragment,
99
+ path : Path :: new ( path, query, fragment)
108
100
}
109
101
}
110
102
@@ -836,26 +828,15 @@ impl fmt::Show for Url {
836
828
}
837
829
}
838
830
839
- try!( write ! ( f, "{}" , self . path) ) ;
840
-
841
- if !self . query . is_empty ( ) {
842
- try!( write ! ( f, "?{}" , query_to_str( & self . query) ) ) ;
843
- }
844
-
845
- match self . fragment {
846
- Some ( ref fragment) => {
847
- write ! ( f, "#{}" , encode_component( fragment. as_slice( ) ) )
848
- }
849
- None => Ok ( ( ) ) ,
850
- }
831
+ write ! ( f, "{}" , self . path)
851
832
}
852
833
}
853
834
854
835
impl fmt:: Show for Path {
855
836
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
856
837
try!( write ! ( f, "{}" , self . path) ) ;
857
838
if !self . query . is_empty ( ) {
858
- try!( write ! ( f, "?{}" , self . query) )
839
+ try!( write ! ( f, "?{}" , query_to_str ( & self . query) ) )
859
840
}
860
841
861
842
match self . fragment {
@@ -981,9 +962,9 @@ mod tests {
981
962
assert_eq ! ( & u. user, & Some ( UserInfo :: new( "user" . to_string( ) , Some ( "pass" . to_string( ) ) ) ) ) ;
982
963
assert_eq ! ( & u. host, & "rust-lang.org" . to_string( ) ) ;
983
964
assert_eq ! ( & u. port, & Some ( "8080" . to_string( ) ) ) ;
984
- assert_eq ! ( & u. path, & "/doc/~u" . to_string( ) ) ;
985
- assert_eq ! ( & u. query, & vec!( ( "s" . to_string( ) , "v" . to_string( ) ) ) ) ;
986
- assert_eq ! ( & u. fragment, & Some ( "something" . to_string( ) ) ) ;
965
+ assert_eq ! ( & u. path. path , & "/doc/~u" . to_string( ) ) ;
966
+ assert_eq ! ( & u. path . query, & vec!( ( "s" . to_string( ) , "v" . to_string( ) ) ) ) ;
967
+ assert_eq ! ( & u. path . fragment, & Some ( "something" . to_string( ) ) ) ;
987
968
}
988
969
989
970
#[ test]
@@ -1002,7 +983,7 @@ mod tests {
1002
983
let urlstr = "http://0.42.42.42/" ;
1003
984
let url = from_str :: < Url > ( urlstr) . unwrap ( ) ;
1004
985
assert ! ( url. host == "0.42.42.42" . to_string( ) ) ;
1005
- assert ! ( url. path == "/" . to_string( ) ) ;
986
+ assert ! ( url. path. path == "/" . to_string( ) ) ;
1006
987
}
1007
988
1008
989
#[ test]
@@ -1020,20 +1001,20 @@ mod tests {
1020
1001
assert_eq ! ( & url. host, & "host" . to_string( ) ) ;
1021
1002
assert_eq ! ( & url. port, & Some ( "1234" . to_string( ) ) ) ;
1022
1003
// is empty path really correct? Other tests think so
1023
- assert_eq ! ( & url. path, & "" . to_string( ) ) ;
1004
+ assert_eq ! ( & url. path. path , & "" . to_string( ) ) ;
1024
1005
let urlstr = "scheme://host:1234/" ;
1025
1006
let url = from_str :: < Url > ( urlstr) . unwrap ( ) ;
1026
1007
assert_eq ! ( & url. scheme, & "scheme" . to_string( ) ) ;
1027
1008
assert_eq ! ( & url. host, & "host" . to_string( ) ) ;
1028
1009
assert_eq ! ( & url. port, & Some ( "1234" . to_string( ) ) ) ;
1029
- assert_eq ! ( & url. path, & "/" . to_string( ) ) ;
1010
+ assert_eq ! ( & url. path. path , & "/" . to_string( ) ) ;
1030
1011
}
1031
1012
1032
1013
#[ test]
1033
1014
fn test_url_with_underscores ( ) {
1034
1015
let urlstr = "http://dotcom.com/file_name.html" ;
1035
1016
let url = from_str :: < Url > ( urlstr) . unwrap ( ) ;
1036
- assert ! ( url. path == "/file_name.html" . to_string( ) ) ;
1017
+ assert ! ( url. path. path == "/file_name.html" . to_string( ) ) ;
1037
1018
}
1038
1019
1039
1020
#[ test]
@@ -1047,7 +1028,7 @@ mod tests {
1047
1028
fn test_url_with_dashes ( ) {
1048
1029
let urlstr = "http://dotcom.com/file-name.html" ;
1049
1030
let url = from_str :: < Url > ( urlstr) . unwrap ( ) ;
1050
- assert ! ( url. path == "/file-name.html" . to_string( ) ) ;
1031
+ assert ! ( url. path. path == "/file-name.html" . to_string( ) ) ;
1051
1032
}
1052
1033
1053
1034
#[ test]
@@ -1133,8 +1114,8 @@ mod tests {
1133
1114
fn test_url_component_encoding ( ) {
1134
1115
let url = "http://rust-lang.org/doc%20uments?ba%25d%20=%23%26%2B" ;
1135
1116
let u = from_str :: < Url > ( url) . unwrap ( ) ;
1136
- assert ! ( u. path == "/doc uments" . to_string( ) ) ;
1137
- assert ! ( u. query == vec!( ( "ba%d " . to_string( ) , "#&+" . to_string( ) ) ) ) ;
1117
+ assert ! ( u. path. path == "/doc uments" . to_string( ) ) ;
1118
+ assert ! ( u. path . query == vec!( ( "ba%d " . to_string( ) , "#&+" . to_string( ) ) ) ) ;
1138
1119
}
1139
1120
1140
1121
#[ test]
0 commit comments