@@ -80,7 +80,7 @@ public static function parseUrlFromEnvironment(array $env)
80
80
81
81
// Build path.
82
82
$ request_uri = isset ($ env ['REQUEST_URI ' ]) ? $ env ['REQUEST_URI ' ] : '' ;
83
- $ path = rawurldecode ( parse_url ('http://example.com ' . $ request_uri , PHP_URL_PATH ) );
83
+ $ path = parse_url ('http://example.com ' . $ request_uri , PHP_URL_PATH );
84
84
85
85
// Build query string.
86
86
$ query = isset ($ env ['QUERY_STRING ' ]) ? $ env ['QUERY_STRING ' ] : '' ;
@@ -107,24 +107,58 @@ public static function parseUrlFromEnvironment(array $env)
107
107
}
108
108
109
109
/**
110
- * Advanced ` parse_url()` method .
110
+ * UTF-8 aware parse_url() implementation .
111
111
*
112
- * @param string $uri
112
+ * @param string $url
113
113
* @return array
114
114
* @throws \InvalidArgumentException
115
115
*/
116
- public static function parseUrl ($ uri )
116
+ public static function parseUrl ($ url )
117
117
{
118
- if (!is_string ($ uri )) {
119
- throw new \InvalidArgumentException ('Uri must be a string ' );
118
+ if (!is_string ($ url )) {
119
+ throw new \InvalidArgumentException ('URL must be a string ' );
120
120
}
121
121
122
- // Set Uri parts.
123
- $ parts = parse_url ($ uri );
122
+ $ encodedUrl = preg_replace_callback (
123
+ '%[^:/@?&=#]+%u ' ,
124
+ function ($ matches ) { return rawurlencode ($ matches [0 ]); },
125
+ $ url
126
+ );
127
+
128
+ $ parts = parse_url ($ encodedUrl );
124
129
if ($ parts === false ) {
125
- throw new \InvalidArgumentException ('Malformed URI : ' . $ uri );
130
+ throw new \InvalidArgumentException ('Malformed URL : ' . $ encodedUrl );
126
131
}
127
132
128
133
return $ parts ;
129
134
}
135
+
136
+ /**
137
+ * Parse query string and return it as an array.
138
+ *
139
+ * @param string $query
140
+ * @params bool $decode
141
+ * @return mixed
142
+ */
143
+ public static function parseQuery ($ query , $ decode = false )
144
+ {
145
+ parse_str ($ query , $ params );
146
+
147
+ if ($ decode ) {
148
+ array_map (function ($ str ) { return rawurldecode ($ str ); }, $ params );
149
+ }
150
+
151
+ return $ params ;
152
+ }
153
+
154
+ /**
155
+ * Build query string from variables.
156
+ *
157
+ * @param array $params
158
+ * @return string
159
+ */
160
+ public static function buildQuery (array $ params )
161
+ {
162
+ return $ params ? http_build_query ($ params , null , ini_get ('arg_separator.output ' ), PHP_QUERY_RFC3986 ) : '' ;
163
+ }
130
164
}
0 commit comments