diff --git a/.github/build-packages.php b/.github/build-packages.php
index b09cea2fe2..e61eae51df 100644
--- a/.github/build-packages.php
+++ b/.github/build-packages.php
@@ -16,7 +16,7 @@ array_shift($dirs);
$mergeBase = trim(shell_exec(sprintf('git merge-base "%s" HEAD', array_shift($dirs))));
$packages = array();
-$flags = \PHP_VERSION_ID >= 50400 ? JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE : 0;
+$flags = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
foreach ($dirs as $k => $dir) {
if (!system("git diff --name-only $mergeBase -- $dir", $exitStatus)) {
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php
index b900c41a8c..48259061a9 100644
--- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php
+++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveNamedArgumentsPassTest.php
@@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
-use Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummy;
+use Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummyWithoutReturnTypes;
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsDummy;
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsVariadicsDummy;
use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
@@ -120,16 +120,16 @@ class ResolveNamedArgumentsPassTest extends TestCase
/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
- * @expectedExceptionMessage Invalid service "Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1": method "Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummy::create()" has no argument named "$notFound". Check your service definition.
+ * @expectedExceptionMessage Invalid service "Symfony\Component\DependencyInjection\Tests\Fixtures\TestDefinition1": method "Symfony\Component\DependencyInjection\Tests\Fixtures\FactoryDummyWithoutReturnTypes::createTestDefinition1()" has no argument named "$notFound". Check your service definition.
*/
public function testCorrectMethodReportedInException()
{
$container = new ContainerBuilder();
- $container->register(FactoryDummy::class, FactoryDummy::class);
+ $container->register(FactoryDummyWithoutReturnTypes::class, FactoryDummyWithoutReturnTypes::class);
$definition = $container->register(TestDefinition1::class, TestDefinition1::class);
- $definition->setFactory(array(FactoryDummy::class, 'create'));
+ $definition->setFactory(array(FactoryDummyWithoutReturnTypes::class, 'createTestDefinition1'));
$definition->setArguments(array('$notFound' => '123'));
$pass = new ResolveNamedArgumentsPass();
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FactoryDummyWithoutReturnTypes.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FactoryDummyWithoutReturnTypes.php
new file mode 100644
index 0000000000..f480a668b5
--- /dev/null
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/FactoryDummyWithoutReturnTypes.php
@@ -0,0 +1,19 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
+
+class FactoryDummyWithoutReturnTypes
+{
+ public function createTestDefinition1()
+ {
+ }
+}
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestDefinition1.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestDefinition1.php
new file mode 100644
index 0000000000..8ec76a9de6
--- /dev/null
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/TestDefinition1.php
@@ -0,0 +1,18 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\DependencyInjection\Tests\Fixtures;
+
+use Symfony\Component\DependencyInjection\Definition;
+
+class TestDefinition1 extends Definition
+{
+}
diff --git a/src/Symfony/Component/Form/Forms.php b/src/Symfony/Component/Form/Forms.php
index 4554144d88..9d190620fd 100644
--- a/src/Symfony/Component/Form/Forms.php
+++ b/src/Symfony/Component/Form/Forms.php
@@ -26,8 +26,8 @@ use Symfony\Component\Form\Extension\Core\CoreExtension;
* ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
* ->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
* ->add('age', 'Symfony\Component\Form\Extension\Core\Type\IntegerType')
- * ->add('gender', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
- * 'choices' => array('Male' => 'm', 'Female' => 'f'),
+ * ->add('color', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
+ * 'choices' => array('Red' => 'r', 'Blue' => 'b'),
* ))
* ->getForm();
*
diff --git a/src/Symfony/Component/Form/Tests/ChoiceList/Factory/DefaultChoiceListFactoryTest.php b/src/Symfony/Component/Form/Tests/ChoiceList/Factory/DefaultChoiceListFactoryTest.php
index 2450248240..983fdd2728 100644
--- a/src/Symfony/Component/Form/Tests/ChoiceList/Factory/DefaultChoiceListFactoryTest.php
+++ b/src/Symfony/Component/Form/Tests/ChoiceList/Factory/DefaultChoiceListFactoryTest.php
@@ -443,7 +443,7 @@ class DefaultChoiceListFactoryTest extends TestCase
array($this->obj2, $this->obj3),
null, // label
null, // index
- array() // ignored
+ null // group
);
$this->assertFlatView($view);
diff --git a/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php b/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php
index e0a333069c..e5d8e9a987 100644
--- a/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php
+++ b/src/Symfony/Component/Form/Tests/CompoundFormPerformanceTest.php
@@ -31,8 +31,8 @@ class CompoundFormPerformanceTest extends FormPerformanceTestCase
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType')
->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
->add('lastName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
- ->add('gender', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
- 'choices' => array('male' => 'Male', 'female' => 'Female'),
+ ->add('color', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
+ 'choices' => array('red' => 'Red', 'blue' => 'Blue'),
'required' => false,
))
->add('age', 'Symfony\Component\Form\Extension\Core\Type\NumberType')
diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php
index d4db5cef41..665c9c0e12 100644
--- a/src/Symfony/Component/HttpFoundation/Request.php
+++ b/src/Symfony/Component/HttpFoundation/Request.php
@@ -1696,15 +1696,23 @@ class Request
} elseif ($this->server->has('REQUEST_URI')) {
$requestUri = $this->server->get('REQUEST_URI');
- // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
- $uriComponents = parse_url($requestUri);
+ if ('' !== $requestUri && '/' === $requestUri[0]) {
+ // To only use path and query remove the fragment.
+ if (false !== $pos = strpos($requestUri, '#')) {
+ $requestUri = substr($requestUri, 0, $pos);
+ }
+ } else {
+ // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path,
+ // only use URL path.
+ $uriComponents = parse_url($requestUri);
- if (isset($uriComponents['path'])) {
- $requestUri = $uriComponents['path'];
- }
+ if (isset($uriComponents['path'])) {
+ $requestUri = $uriComponents['path'];
+ }
- if (isset($uriComponents['query'])) {
- $requestUri .= '?'.$uriComponents['query'];
+ if (isset($uriComponents['query'])) {
+ $requestUri .= '?'.$uriComponents['query'];
+ }
}
} elseif ($this->server->has('ORIG_PATH_INFO')) {
// IIS 5.0, PHP as CGI
diff --git a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php
index 0711c515f2..36a9491348 100644
--- a/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php
+++ b/src/Symfony/Component/HttpFoundation/Tests/RequestTest.php
@@ -283,6 +283,55 @@ class RequestTest extends TestCase
$this->assertEquals('http://test.com/foo', $request->getUri());
}
+ /**
+ * @dataProvider getRequestUriData
+ */
+ public function testGetRequestUri($serverRequestUri, $expected, $message)
+ {
+ $request = new Request();
+ $request->server->add(array(
+ 'REQUEST_URI' => $serverRequestUri,
+
+ // For having http://test.com
+ 'SERVER_NAME' => 'test.com',
+ 'SERVER_PORT' => 80,
+ ));
+
+ $this->assertSame($expected, $request->getRequestUri(), $message);
+ $this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
+ }
+
+ public function getRequestUriData()
+ {
+ $message = 'Do not modify the path.';
+ yield array('/foo', '/foo', $message);
+ yield array('//bar/foo', '//bar/foo', $message);
+ yield array('///bar/foo', '///bar/foo', $message);
+
+ $message = 'Handle when the scheme, host are on REQUEST_URI.';
+ yield array('http://test.com/foo?bar=baz', '/foo?bar=baz', $message);
+
+ $message = 'Handle when the scheme, host and port are on REQUEST_URI.';
+ yield array('http://test.com:80/foo', '/foo', $message);
+ yield array('https://test.com:8080/foo', '/foo', $message);
+ yield array('https://test.com:443/foo', '/foo', $message);
+
+ $message = 'Fragment should not be included in the URI';
+ yield array('http://test.com/foo#bar', '/foo', $message);
+ yield array('/foo#bar', '/foo', $message);
+ }
+
+ public function testGetRequestUriWithoutRequiredHeader()
+ {
+ $expected = '';
+
+ $request = new Request();
+
+ $message = 'Fallback to empty URI when headers are missing.';
+ $this->assertSame($expected, $request->getRequestUri(), $message);
+ $this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
+ }
+
public function testCreateCheckPrecedence()
{
// server is used by default
diff --git a/src/Symfony/Component/HttpKernel/Tests/DataCollector/DumpDataCollectorTest.php b/src/Symfony/Component/HttpKernel/Tests/DataCollector/DumpDataCollectorTest.php
index 57384a79ff..0f46709049 100644
--- a/src/Symfony/Component/HttpKernel/Tests/DataCollector/DumpDataCollectorTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/DataCollector/DumpDataCollectorTest.php
@@ -144,11 +144,8 @@ EOTXT;
$collector->dump($data);
$line = __LINE__ - 1;
$output = preg_replace("/\033\[[^m]*m/", '', ob_get_clean());
- if (\PHP_VERSION_ID >= 50400) {
- $this->assertSame("DumpDataCollectorTest.php on line {$line}:\n456\n", $output);
- } else {
- $this->assertSame("\"DumpDataCollectorTest.php on line {$line}:\"\n456\n", $output);
- }
+
+ $this->assertSame("DumpDataCollectorTest.php on line {$line}:\n456\n", $output);
ob_start();
$collector->__destruct();
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
index 7ac1f4faa5..79a9f74da4 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
@@ -60,7 +60,7 @@ class EsiFragmentRendererTest extends TestCase
$altReference = new ControllerReference('alt_controller', array(), array());
$this->assertEquals(
- '',
+ '',
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
);
}
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
index e3926708c1..68f8ded4e9 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
@@ -32,7 +32,7 @@ class HIncludeFragmentRendererTest extends TestCase
{
$strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
- $this->assertEquals('', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
+ $this->assertEquals('', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
}
public function testRenderWithUri()
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php
index f725803118..ff98fd2616 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/SsiFragmentRendererTest.php
@@ -51,7 +51,7 @@ class SsiFragmentRendererTest extends TestCase
$altReference = new ControllerReference('alt_controller', array(), array());
$this->assertEquals(
- '',
+ '',
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
);
}
diff --git a/src/Symfony/Component/HttpKernel/Tests/UriSignerTest.php b/src/Symfony/Component/HttpKernel/Tests/UriSignerTest.php
index 84ec19f70d..9b7fe08a99 100644
--- a/src/Symfony/Component/HttpKernel/Tests/UriSignerTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/UriSignerTest.php
@@ -21,7 +21,8 @@ class UriSignerTest extends TestCase
$signer = new UriSigner('foobar');
$this->assertContains('?_hash=', $signer->sign('http://example.com/foo'));
- $this->assertContains('&_hash=', $signer->sign('http://example.com/foo?foo=bar'));
+ $this->assertContains('?_hash=', $signer->sign('http://example.com/foo?foo=bar'));
+ $this->assertContains('&foo=', $signer->sign('http://example.com/foo?foo=bar'));
}
public function testCheck()
@@ -45,7 +46,7 @@ class UriSignerTest extends TestCase
$signer = new UriSigner('foobar');
$this->assertSame(
- 'http://example.com/foo?baz=bay&foo=bar&_hash=rIOcC%2FF3DoEGo%2FvnESjSp7uU9zA9S%2F%2BOLhxgMexoPUM%3D',
+ 'http://example.com/foo?_hash=rIOcC%2FF3DoEGo%2FvnESjSp7uU9zA9S%2F%2BOLhxgMexoPUM%3D&baz=bay&foo=bar',
$signer->sign('http://example.com/foo?foo=bar&baz=bay')
);
$this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar&baz=bay')));
@@ -61,4 +62,15 @@ class UriSignerTest extends TestCase
);
$this->assertTrue($signer->check($signer->sign('http://example.com/foo?foo=bar&baz=bay')));
}
+
+ public function testSignerWorksWithFragments()
+ {
+ $signer = new UriSigner('foobar');
+
+ $this->assertSame(
+ 'http://example.com/foo?_hash=EhpAUyEobiM3QTrKxoLOtQq5IsWyWedoXDPqIjzNj5o%3D&bar=foo&foo=bar#foobar',
+ $signer->sign('http://example.com/foo?bar=foo&foo=bar#foobar')
+ );
+ $this->assertTrue($signer->check($signer->sign('http://example.com/foo?bar=foo&foo=bar#foobar')));
+ }
}
diff --git a/src/Symfony/Component/HttpKernel/UriSigner.php b/src/Symfony/Component/HttpKernel/UriSigner.php
index de73039b34..210f731735 100644
--- a/src/Symfony/Component/HttpKernel/UriSigner.php
+++ b/src/Symfony/Component/HttpKernel/UriSigner.php
@@ -51,8 +51,9 @@ class UriSigner
}
$uri = $this->buildUrl($url, $params);
+ $params[$this->parameter] = $this->computeHash($uri);
- return $uri.(false === strpos($uri, '?') ? '?' : '&').$this->parameter.'='.$this->computeHash($uri);
+ return $this->buildUrl($url, $params);
}
/**
@@ -75,7 +76,7 @@ class UriSigner
return false;
}
- $hash = urlencode($params[$this->parameter]);
+ $hash = $params[$this->parameter];
unset($params[$this->parameter]);
return $this->computeHash($this->buildUrl($url, $params)) === $hash;
@@ -83,7 +84,7 @@ class UriSigner
private function computeHash($uri)
{
- return urlencode(base64_encode(hash_hmac('sha256', $uri, $this->secret, true)));
+ return base64_encode(hash_hmac('sha256', $uri, $this->secret, true));
}
private function buildUrl(array $url, array $params = array())