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))));
|
||||
|
||||
$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)) {
|
||||
|
@ -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();
|
||||
|
@ -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('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();
|
||||
*
|
||||
|
@ -443,7 +443,7 @@ class DefaultChoiceListFactoryTest extends TestCase
|
||||
array($this->obj2, $this->obj3),
|
||||
null, // label
|
||||
null, // index
|
||||
array() // ignored
|
||||
null // group
|
||||
);
|
||||
|
||||
$this->assertFlatView($view);
|
||||
|
@ -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')
|
||||
|
@ -1696,7 +1696,14 @@ 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
|
||||
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'])) {
|
||||
@ -1706,6 +1713,7 @@ class Request
|
||||
if (isset($uriComponents['query'])) {
|
||||
$requestUri .= '?'.$uriComponents['query'];
|
||||
}
|
||||
}
|
||||
} elseif ($this->server->has('ORIG_PATH_INFO')) {
|
||||
// IIS 5.0, PHP as CGI
|
||||
$requestUri = $this->server->get('ORIG_PATH_INFO');
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
ob_start();
|
||||
$collector->__destruct();
|
||||
|
@ -60,7 +60,7 @@ class EsiFragmentRendererTest extends TestCase
|
||||
$altReference = new ControllerReference('alt_controller', array(), array());
|
||||
|
||||
$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()
|
||||
);
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ class HIncludeFragmentRendererTest extends TestCase
|
||||
{
|
||||
$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()
|
||||
|
@ -51,7 +51,7 @@ class SsiFragmentRendererTest extends TestCase
|
||||
$altReference = new ControllerReference('alt_controller', array(), array());
|
||||
|
||||
$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()
|
||||
);
|
||||
}
|
||||
|
@ -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')));
|
||||
}
|
||||
}
|
||||
|
@ -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())
|
||||
|
Reference in New Issue
Block a user