Skip to content

Commit

Permalink
Standalone query string normalization
Browse files Browse the repository at this point in the history
  • Loading branch information
simensen committed Jul 2, 2012
1 parent 81fe2ff commit 6296a24
Showing 1 changed file with 35 additions and 20 deletions.
55 changes: 35 additions & 20 deletions src/Symfony/Component/HttpFoundation/Request.php
Expand Up @@ -463,6 +463,40 @@ static public function isProxyTrusted()
return self::$trustProxy;
}

/**
* Normalizes a query string.
*
* It builds a normalized query string, where keys/value pairs are alphabetized
* and have consistent escaping.
*
* @param string $qs Query string
*
* @return string|null A normalized query string for the Request
*/
static public function normalizeQueryString($qs = null)
{
if (!$qs) {
return null;
}

$parts = array();
$order = array();

foreach (explode('&', $qs) as $segment) {
if (false === strpos($segment, '=')) {
$parts[] = $segment;
$order[] = $segment;
} else {
$tmp = explode('=', rawurldecode($segment), 2);
$parts[] = rawurlencode($tmp[0]).'='.rawurlencode($tmp[1]);
$order[] = $tmp[0];
}
}
array_multisort($order, SORT_ASC, $parts);

return implode('&', $parts);
}

/**
* Gets a "parameter" value.
*
Expand Down Expand Up @@ -809,26 +843,7 @@ public function getUriForPath($path)
*/
public function getQueryString()
{
if (!$qs = $this->server->get('QUERY_STRING')) {
return null;
}

$parts = array();
$order = array();

foreach (explode('&', $qs) as $segment) {
if (false === strpos($segment, '=')) {
$parts[] = $segment;
$order[] = $segment;
} else {
$tmp = explode('=', rawurldecode($segment), 2);
$parts[] = rawurlencode($tmp[0]).'='.rawurlencode($tmp[1]);
$order[] = $tmp[0];
}
}
array_multisort($order, SORT_ASC, $parts);

return implode('&', $parts);
return static::normalizeQueryString($this->server->get('QUERY_STRING'));
}

/**
Expand Down

0 comments on commit 6296a24

Please sign in to comment.