Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge branch '2.1' of https://github.com/cakephp/cakephp into 2.1-err…

…or-handler-bootstrap
  • Loading branch information...
commit 2c55c7c193c00297c24431c464a6b2b918f6bb5c 2 parents 7a93276 + 150c9fc
@tPl0ch authored
View
53 lib/Cake/Network/Http/HttpSocket.php
@@ -768,7 +768,58 @@ protected function _parseQuery($query) {
if (is_array($query)) {
return $query;
}
- parse_str(ltrim($query, '?'), $parsedQuery);
+
+ if (is_array($query)) {
+ return $query;
+ }
+ $parsedQuery = array();
+
+ if (is_string($query) && !empty($query)) {
+ $query = preg_replace('/^\?/', '', $query);
+ $items = explode('&', $query);
+
+ foreach ($items as $item) {
+ if (strpos($item, '=') !== false) {
+ list($key, $value) = explode('=', $item, 2);
+ } else {
+ $key = $item;
+ $value = null;
+ }
+
+ $key = urldecode($key);
+ $value = urldecode($value);
+
+ if (preg_match_all('/\[([^\[\]]*)\]/iUs', $key, $matches)) {
+ $subKeys = $matches[1];
+ $rootKey = substr($key, 0, strpos($key, '['));
+ if (!empty($rootKey)) {
+ array_unshift($subKeys, $rootKey);
+ }
+ $queryNode =& $parsedQuery;
+
+ foreach ($subKeys as $subKey) {
+ if (!is_array($queryNode)) {
+ $queryNode = array();
+ }
+
+ if ($subKey === '') {
+ $queryNode[] = array();
+ end($queryNode);
+ $subKey = key($queryNode);
+ }
+ $queryNode =& $queryNode[$subKey];
+ }
+ $queryNode = $value;
+ continue;
+ }
+ if (!isset($parsedQuery[$key])) {
+ $parsedQuery[$key] = $value;
+ } else {
+ $parsedQuery[$key] = (array)$parsedQuery[$key];
+ $parsedQuery[$key][] = $value;
+ }
+ }
+ }
return $parsedQuery;
}
View
2  lib/Cake/Routing/Route/CakeRoute.php
@@ -240,7 +240,7 @@ public function parse($url) {
}
if (isset($route['_trailing_'])) {
- $route['pass'][] = $route['_trailing_'];
+ $route['pass'][] = rawurldecode($route['_trailing_']);
unset($route['_trailing_']);
}
View
10 lib/Cake/Test/Case/Network/Http/HttpSocketTest.php
@@ -1450,7 +1450,15 @@ public function testParseQuery() {
),
'empty' => ''
);
- $this->assertEquals($query, $expectedQuery);
+ $this->assertEquals($expectedQuery, $query);
+
+ $query = 'openid.ns=example.com&foo=bar&foo=baz';
+ $result = $this->Socket->parseQuery($query);
+ $expected = array(
+ 'openid.ns' => 'example.com',
+ 'foo' => array('bar', 'baz')
+ );
+ $this->assertEquals($expected, $result);
}
/**
View
19 lib/Cake/Test/Case/Routing/Route/CakeRouteTest.php
@@ -857,4 +857,23 @@ public function testParseTrailing() {
);
$this->assertEquals($expected, $result);
}
+
+/**
+ * Test the /** special type on parsing - UTF8.
+ *
+ * @return void
+ */
+
+ public function testParseTrailingUTF8() {
+ $route = new CakeRoute( '/category/**', array('controller' => 'categories','action' => 'index'));
+ $result = $route->parse('/category/%D9%85%D9%88%D8%A8%D8%A7%DB%8C%D9%84');
+ $expected = array(
+ 'controller' => 'categories',
+ 'action' => 'index',
+ 'pass' => array('موبایل'),
+ 'named' => array()
+ );
+ $this->assertEquals($expected, $result);
+
+ }
}
Please sign in to comment.
Something went wrong with that request. Please try again.