Merge branch '3.4' into 4.1
* 3.4: properly fix tests on PHP 5 fix tests on PHP 5 bug #29697 [DI] Fixed wrong factory method in exception (Wojciech Gorczyca) Changed gender choice types to color remove no longer needed PHP version checks Fixed groupBy argument value in DefaultChoiceListFactoryTest [HttpKernel] Correctly Render Signed URIs Containing Fragments [HttpFoundation] Fix request uri when it starts with double slashes
This commit is contained in:
commit
1fa24cb363
2
.github/build-packages.php
vendored
2
.github/build-packages.php
vendored
@ -16,7 +16,7 @@ array_shift($dirs);
|
|||||||
$mergeBase = trim(shell_exec(sprintf('git merge-base "%s" HEAD', array_shift($dirs))));
|
$mergeBase = trim(shell_exec(sprintf('git merge-base "%s" HEAD', array_shift($dirs))));
|
||||||
|
|
||||||
$packages = array();
|
$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) {
|
foreach ($dirs as $k => $dir) {
|
||||||
if (!system("git diff --name-only $mergeBase -- $dir", $exitStatus)) {
|
if (!system("git diff --name-only $mergeBase -- $dir", $exitStatus)) {
|
||||||
|
@ -16,7 +16,7 @@ use Symfony\Component\DependencyInjection\Compiler\ResolveNamedArgumentsPass;
|
|||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
use Symfony\Component\DependencyInjection\Reference;
|
use Symfony\Component\DependencyInjection\Reference;
|
||||||
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
|
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\NamedArgumentsDummy;
|
||||||
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsVariadicsDummy;
|
use Symfony\Component\DependencyInjection\Tests\Fixtures\NamedArgumentsVariadicsDummy;
|
||||||
use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
|
use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
|
||||||
@ -120,16 +120,16 @@ class ResolveNamedArgumentsPassTest extends TestCase
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException
|
* @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()
|
public function testCorrectMethodReportedInException()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
$container->register(FactoryDummy::class, FactoryDummy::class);
|
$container->register(FactoryDummyWithoutReturnTypes::class, FactoryDummyWithoutReturnTypes::class);
|
||||||
|
|
||||||
$definition = $container->register(TestDefinition1::class, TestDefinition1::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'));
|
$definition->setArguments(array('$notFound' => '123'));
|
||||||
|
|
||||||
$pass = new ResolveNamedArgumentsPass();
|
$pass = new ResolveNamedArgumentsPass();
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
{
|
||||||
|
}
|
@ -26,8 +26,8 @@ use Symfony\Component\Form\Extension\Core\CoreExtension;
|
|||||||
* ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
|
* ->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
|
||||||
* ->add('lastName', '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('age', 'Symfony\Component\Form\Extension\Core\Type\IntegerType')
|
||||||
* ->add('gender', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
|
* ->add('color', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
|
||||||
* 'choices' => array('Male' => 'm', 'Female' => 'f'),
|
* 'choices' => array('Red' => 'r', 'Blue' => 'b'),
|
||||||
* ))
|
* ))
|
||||||
* ->getForm();
|
* ->getForm();
|
||||||
*
|
*
|
||||||
|
@ -443,7 +443,7 @@ class DefaultChoiceListFactoryTest extends TestCase
|
|||||||
array($this->obj2, $this->obj3),
|
array($this->obj2, $this->obj3),
|
||||||
null, // label
|
null, // label
|
||||||
null, // index
|
null, // index
|
||||||
array() // ignored
|
null // group
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFlatView($view);
|
$this->assertFlatView($view);
|
||||||
|
@ -31,8 +31,8 @@ class CompoundFormPerformanceTest extends FormPerformanceTestCase
|
|||||||
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType')
|
$form = $this->factory->createBuilder('Symfony\Component\Form\Extension\Core\Type\FormType')
|
||||||
->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
|
->add('firstName', 'Symfony\Component\Form\Extension\Core\Type\TextType')
|
||||||
->add('lastName', '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(
|
->add('color', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', array(
|
||||||
'choices' => array('male' => 'Male', 'female' => 'Female'),
|
'choices' => array('red' => 'Red', 'blue' => 'Blue'),
|
||||||
'required' => false,
|
'required' => false,
|
||||||
))
|
))
|
||||||
->add('age', 'Symfony\Component\Form\Extension\Core\Type\NumberType')
|
->add('age', 'Symfony\Component\Form\Extension\Core\Type\NumberType')
|
||||||
|
@ -1696,15 +1696,23 @@ class Request
|
|||||||
} elseif ($this->server->has('REQUEST_URI')) {
|
} elseif ($this->server->has('REQUEST_URI')) {
|
||||||
$requestUri = $this->server->get('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
|
if ('' !== $requestUri && '/' === $requestUri[0]) {
|
||||||
$uriComponents = parse_url($requestUri);
|
// 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'])) {
|
if (isset($uriComponents['path'])) {
|
||||||
$requestUri = $uriComponents['path'];
|
$requestUri = $uriComponents['path'];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($uriComponents['query'])) {
|
if (isset($uriComponents['query'])) {
|
||||||
$requestUri .= '?'.$uriComponents['query'];
|
$requestUri .= '?'.$uriComponents['query'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} elseif ($this->server->has('ORIG_PATH_INFO')) {
|
} elseif ($this->server->has('ORIG_PATH_INFO')) {
|
||||||
// IIS 5.0, PHP as CGI
|
// IIS 5.0, PHP as CGI
|
||||||
|
@ -283,6 +283,55 @@ class RequestTest extends TestCase
|
|||||||
$this->assertEquals('http://test.com/foo', $request->getUri());
|
$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()
|
public function testCreateCheckPrecedence()
|
||||||
{
|
{
|
||||||
// server is used by default
|
// server is used by default
|
||||||
|
@ -144,11 +144,8 @@ EOTXT;
|
|||||||
$collector->dump($data);
|
$collector->dump($data);
|
||||||
$line = __LINE__ - 1;
|
$line = __LINE__ - 1;
|
||||||
$output = preg_replace("/\033\[[^m]*m/", '', ob_get_clean());
|
$output = preg_replace("/\033\[[^m]*m/", '', ob_get_clean());
|
||||||
if (\PHP_VERSION_ID >= 50400) {
|
|
||||||
$this->assertSame("DumpDataCollectorTest.php on line {$line}:\n456\n", $output);
|
$this->assertSame("DumpDataCollectorTest.php on line {$line}:\n456\n", $output);
|
||||||
} else {
|
|
||||||
$this->assertSame("\"DumpDataCollectorTest.php on line {$line}:\"\n456\n", $output);
|
|
||||||
}
|
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
$collector->__destruct();
|
$collector->__destruct();
|
||||||
|
@ -60,7 +60,7 @@ class EsiFragmentRendererTest extends TestCase
|
|||||||
$altReference = new ControllerReference('alt_controller', array(), array());
|
$altReference = new ControllerReference('alt_controller', array(), array());
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
'<esi:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller&_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D" alt="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dalt_controller&_hash=iPJEdRoUpGrM1ztqByiorpfMPtiW%2FOWwdH1DBUXHhEc%3D" />',
|
'<esi:include src="/_fragment?_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D&_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller" alt="/_fragment?_hash=iPJEdRoUpGrM1ztqByiorpfMPtiW%2FOWwdH1DBUXHhEc%3D&_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dalt_controller" />',
|
||||||
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
|
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ class HIncludeFragmentRendererTest extends TestCase
|
|||||||
{
|
{
|
||||||
$strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
|
$strategy = new HIncludeFragmentRenderer(null, new UriSigner('foo'));
|
||||||
|
|
||||||
$this->assertEquals('<hx:include src="/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller&_hash=BP%2BOzCD5MRUI%2BHJpgPDOmoju00FnzLhP3TGcSHbbBLs%3D"></hx:include>', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
|
$this->assertEquals('<hx:include src="/_fragment?_hash=BP%2BOzCD5MRUI%2BHJpgPDOmoju00FnzLhP3TGcSHbbBLs%3D&_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller"></hx:include>', $strategy->render(new ControllerReference('main_controller', array(), array()), Request::create('/'))->getContent());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testRenderWithUri()
|
public function testRenderWithUri()
|
||||||
|
@ -51,7 +51,7 @@ class SsiFragmentRendererTest extends TestCase
|
|||||||
$altReference = new ControllerReference('alt_controller', array(), array());
|
$altReference = new ControllerReference('alt_controller', array(), array());
|
||||||
|
|
||||||
$this->assertEquals(
|
$this->assertEquals(
|
||||||
'<!--#include virtual="/_fragment?_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller&_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D" -->',
|
'<!--#include virtual="/_fragment?_hash=Jz1P8NErmhKTeI6onI1EdAXTB85359MY3RIk5mSJ60w%3D&_path=_format%3Dhtml%26_locale%3Dfr%26_controller%3Dmain_controller" -->',
|
||||||
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
|
$strategy->render($reference, $request, array('alt' => $altReference))->getContent()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,8 @@ class UriSignerTest extends TestCase
|
|||||||
$signer = new UriSigner('foobar');
|
$signer = new UriSigner('foobar');
|
||||||
|
|
||||||
$this->assertContains('?_hash=', $signer->sign('http://example.com/foo'));
|
$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()
|
public function testCheck()
|
||||||
@ -45,7 +46,7 @@ class UriSignerTest extends TestCase
|
|||||||
$signer = new UriSigner('foobar');
|
$signer = new UriSigner('foobar');
|
||||||
|
|
||||||
$this->assertSame(
|
$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')
|
$signer->sign('http://example.com/foo?foo=bar&baz=bay')
|
||||||
);
|
);
|
||||||
$this->assertTrue($signer->check($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')));
|
$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')));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,8 +51,9 @@ class UriSigner
|
|||||||
}
|
}
|
||||||
|
|
||||||
$uri = $this->buildUrl($url, $params);
|
$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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$hash = urlencode($params[$this->parameter]);
|
$hash = $params[$this->parameter];
|
||||||
unset($params[$this->parameter]);
|
unset($params[$this->parameter]);
|
||||||
|
|
||||||
return $this->computeHash($this->buildUrl($url, $params)) === $hash;
|
return $this->computeHash($this->buildUrl($url, $params)) === $hash;
|
||||||
@ -83,7 +84,7 @@ class UriSigner
|
|||||||
|
|
||||||
private function computeHash($uri)
|
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())
|
private function buildUrl(array $url, array $params = array())
|
||||||
|
Reference in New Issue
Block a user