mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
Remove parse_str() its buggy and wrong.
parse_str() replaces `.` with _ and drops duplicated keys, which is incorrect. Replace parse_str with an updated version of parseQuery from 1.x Fixes #2629 Fixes #2647
This commit is contained in:
parent
621b086d9c
commit
150c9fc6a3
2 changed files with 61 additions and 2 deletions
|
@ -768,7 +768,58 @@ class HttpSocket extends CakeSocket {
|
|||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1450,7 +1450,15 @@ class HttpSocketTest extends CakeTestCase {
|
|||
),
|
||||
'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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in a new issue