feature #19639 [Routing] Generate URLs in compliance with PHP_QUERY_RFC3986 (jameshalsall)
This PR was submitted for the 2.7 branch but it was merged into the 3.2-dev branch instead (closes #19639).
Discussion
----------
[Routing] Generate URLs in compliance with PHP_QUERY_RFC3986
| Q | A
| ------------- | ---
| Branch? | 2.7
| Bug fix? | yes
| New feature? | no
| BC breaks? | no?
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #19625
| License | MIT
| Doc PR |
Commits
-------
ce724e2
[Routing] Generate URLs in compliance with PHP_QUERY_RFC3986
This commit is contained in:
commit
885c388917
@ -266,7 +266,7 @@ class UrlGenerator implements UrlGeneratorInterface, ConfigurableRequirementsInt
|
|||||||
$fragment = isset($extra['_fragment']) ? $extra['_fragment'] : '';
|
$fragment = isset($extra['_fragment']) ? $extra['_fragment'] : '';
|
||||||
unset($extra['_fragment']);
|
unset($extra['_fragment']);
|
||||||
|
|
||||||
if ($extra && $query = http_build_query($extra, '', '&')) {
|
if ($extra && $query = http_build_query($extra, '', '&', PHP_QUERY_RFC3986)) {
|
||||||
// "/" and "?" can be left decoded for better user experience, see
|
// "/" and "?" can be left decoded for better user experience, see
|
||||||
// http://tools.ietf.org/html/rfc3986#section-3.4
|
// http://tools.ietf.org/html/rfc3986#section-3.4
|
||||||
$url .= '?'.strtr($query, array('%2F' => '/'));
|
$url .= '?'.strtr($query, array('%2F' => '/'));
|
||||||
|
@ -325,18 +325,24 @@ class UrlGeneratorTest extends \PHPUnit_Framework_TestCase
|
|||||||
|
|
||||||
public function testUrlEncoding()
|
public function testUrlEncoding()
|
||||||
{
|
{
|
||||||
|
if (defined('PHP_QUERY_RFC3986')) {
|
||||||
|
$expectedPath = '/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||||
|
.'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||||
|
.'?query=%40%3A%5B%5D/%28%29%2A%27%22%20%2B%2C%3B-._~%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id';
|
||||||
|
} else {
|
||||||
|
$expectedPath = '/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||||
|
.'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
||||||
|
.'?query=%40%3A%5B%5D/%28%29%2A%27%22+%2B%2C%3B-._%7E%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id';
|
||||||
|
}
|
||||||
|
|
||||||
// This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986)
|
// This tests the encoding of reserved characters that are used for delimiting of URI components (defined in RFC 3986)
|
||||||
// and other special ASCII chars. These chars are tested as static text path, variable path and query param.
|
// and other special ASCII chars. These chars are tested as static text path, variable path and query param.
|
||||||
$chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id';
|
$chars = '@:[]/()*\'" +,;-._~&$<>|{}%\\^`!?foo=bar#id';
|
||||||
$routes = $this->getRoutes('test', new Route("/$chars/{varpath}", array(), array('varpath' => '.+')));
|
$routes = $this->getRoutes('test', new Route("/$chars/{varpath}", array(), array('varpath' => '.+')));
|
||||||
$this->assertSame('/app.php/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
$this->assertSame($expectedPath, $this->getGenerator($routes)->generate('test', array(
|
||||||
.'/@:%5B%5D/%28%29*%27%22%20+,;-._~%26%24%3C%3E|%7B%7D%25%5C%5E%60!%3Ffoo=bar%23id'
|
|
||||||
.'?query=%40%3A%5B%5D/%28%29%2A%27%22+%2B%2C%3B-._%7E%26%24%3C%3E%7C%7B%7D%25%5C%5E%60%21%3Ffoo%3Dbar%23id',
|
|
||||||
$this->getGenerator($routes)->generate('test', array(
|
|
||||||
'varpath' => $chars,
|
'varpath' => $chars,
|
||||||
'query' => $chars,
|
'query' => $chars,
|
||||||
))
|
)));
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testEncodingOfRelativePathSegments()
|
public function testEncodingOfRelativePathSegments()
|
||||||
|
Reference in New Issue
Block a user