Skip to content

Commit 9e78a06

Browse files
committed
Merge branch '2.4'
* 2.4: added missing unit test fixed too greedy replacements fixed protocol-relative URLs added override power to server parameters provided on request method made parsing controllers more robust Fixed YamlFileLoader imports path
2 parents b78d174 + 82cbf69 commit 9e78a06

File tree

8 files changed

+172
-36
lines changed

8 files changed

+172
-36
lines changed

src/Symfony/Component/BrowserKit/Client.php

+20-1
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,15 @@ public function request($method, $uri, array $parameters = array(), array $files
295295
}
296296

297297
$uri = $this->getAbsoluteUri($uri);
298+
299+
if (isset($server['HTTP_HOST'])) {
300+
$uri = preg_replace('{^(https?\://)'.parse_url($uri, PHP_URL_HOST).'}', '\\1'.$server['HTTP_HOST'], $uri);
301+
}
302+
303+
if (isset($server['HTTPS'])) {
304+
$uri = preg_replace('{^'.parse_url($uri, PHP_URL_SCHEME).'}', $server['HTTPS'] ? 'https' : 'http', $uri);
305+
}
306+
298307
$server = array_merge($this->server, $server);
299308

300309
if (!$this->history->isEmpty()) {
@@ -509,7 +518,7 @@ public function followRedirect()
509518
}
510519

511520
$server = $request->getServer();
512-
unset($server['HTTP_IF_NONE_MATCH'], $server['HTTP_IF_MODIFIED_SINCE']);
521+
$server = $this->updateServerFromUri($server, $this->redirect);
513522

514523
$this->isMainRequest = false;
515524

@@ -591,4 +600,14 @@ protected function requestFromRequest(Request $request, $changeHistory = true)
591600
{
592601
return $this->request($request->getMethod(), $request->getUri(), $request->getParameters(), $request->getFiles(), $request->getServer(), $request->getContent(), $changeHistory);
593602
}
603+
604+
private function updateServerFromUri($server, $uri)
605+
{
606+
$server['HTTP_HOST'] = parse_url($uri, PHP_URL_HOST);
607+
$scheme = parse_url($uri, PHP_URL_SCHEME);
608+
$server['HTTPS'] = null === $scheme ? $server['HTTPS'] : 'https' == $scheme;
609+
unset($server['HTTP_IF_NONE_MATCH'], $server['HTTP_IF_MODIFIED_SINCE']);
610+
611+
return $server;
612+
}
594613
}

src/Symfony/Component/BrowserKit/Tests/ClientTest.php

+34
Original file line numberDiff line numberDiff line change
@@ -549,4 +549,38 @@ public function testSetServerParameter()
549549
$client->setServerParameter('HTTP_USER_AGENT', 'testua');
550550
$this->assertEquals('testua', $client->getServerParameter('HTTP_USER_AGENT'));
551551
}
552+
553+
public function testSetServerParameterInRequest()
554+
{
555+
$client = new TestClient();
556+
557+
$this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
558+
$this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));
559+
560+
$client->request('GET', 'https://www.example.com/https/www.example.com', array(), array(), array(
561+
'HTTP_HOST' => 'testhost',
562+
'HTTP_USER_AGENT' => 'testua',
563+
'HTTPS' => false,
564+
'NEW_SERVER_KEY' => 'new-server-key-value'
565+
));
566+
567+
$this->assertEquals('localhost', $client->getServerParameter('HTTP_HOST'));
568+
$this->assertEquals('Symfony2 BrowserKit', $client->getServerParameter('HTTP_USER_AGENT'));
569+
570+
$this->assertEquals('http://testhost/https/www.example.com', $client->getRequest()->getUri());
571+
572+
$server = $client->getRequest()->getServer();
573+
574+
$this->assertArrayHasKey('HTTP_USER_AGENT', $server);
575+
$this->assertEquals('testua', $server['HTTP_USER_AGENT']);
576+
577+
$this->assertArrayHasKey('HTTP_HOST', $server);
578+
$this->assertEquals('testhost', $server['HTTP_HOST']);
579+
580+
$this->assertArrayHasKey('NEW_SERVER_KEY', $server);
581+
$this->assertEquals('new-server-key-value', $server['NEW_SERVER_KEY']);
582+
583+
$this->assertArrayHasKey('HTTPS', $server);
584+
$this->assertFalse($server['HTTPS']);
585+
}
552586
}

src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public function load($file, $type = null)
5252
}
5353

5454
// imports
55-
$this->parseImports($content, $file);
55+
$this->parseImports($content, $path);
5656

5757
// parameters
5858
if (isset($content['parameters'])) {

src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php

+20-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Symfony\Component\DependencyInjection\ContainerInterface;
2222
use Symfony\Component\DependencyInjection\Definition;
2323
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
24+
use Symfony\Component\DependencyInjection\Exception\InactiveScopeException;
2425
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
2526
use Symfony\Component\DependencyInjection\Reference;
2627
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
@@ -152,6 +153,16 @@ public function testGetReturnsNullOnInactiveScope()
152153
$this->assertNull($builder->get('foo', ContainerInterface::NULL_ON_INVALID_REFERENCE));
153154
}
154155

156+
/**
157+
* @covers Symfony\Component\DependencyInjection\ContainerBuilder::get
158+
*/
159+
public function testGetReturnsNullOnInactiveScopeWhenServiceIsCreatedByAMethod()
160+
{
161+
$builder = new ProjectContainer();
162+
163+
$this->assertNull($builder->get('foobaz', ContainerInterface::NULL_ON_INVALID_REFERENCE));
164+
}
165+
155166
/**
156167
* @covers Symfony\Component\DependencyInjection\ContainerBuilder::getServiceIds
157168
*/
@@ -790,8 +801,16 @@ public function testLazyLoadedService()
790801
}
791802
}
792803

793-
$this->assertEquals(true, $classInList);
804+
$this->assertTrue($classInList);
794805
}
795806
}
796807

797808
class FooClass {}
809+
810+
class ProjectContainer extends ContainerBuilder
811+
{
812+
public function getFoobazService()
813+
{
814+
throw new InactiveScopeException('foo', 'request');
815+
}
816+
}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
imports:
22
- { resource: services2.yml }
33
- { resource: services3.yml }
4+
- { resource: "../php/simple.php" }
45
- { resource: "../ini/parameters.ini", class: Symfony\Component\DependencyInjection\Loader\IniFileLoader }
56
- { resource: "../ini/parameters2.ini" }
67
- { resource: "../xml/services13.xml" }

src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
1919
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
2020
use Symfony\Component\DependencyInjection\Loader\IniFileLoader;
21+
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
2122
use Symfony\Component\Config\Loader\LoaderResolver;
2223
use Symfony\Component\Config\FileLocator;
2324
use Symfony\Component\ExpressionLanguage\Expression;
@@ -83,6 +84,7 @@ public function testLoadImports()
8384
$resolver = new LoaderResolver(array(
8485
new IniFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
8586
new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
87+
new PhpFileLoader($container, new FileLocator(self::$fixturesPath.'/php')),
8688
$loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')),
8789
));
8890
$loader->setResolver($resolver);

src/Symfony/Component/HttpKernel/Controller/ControllerResolver.php

+10-2
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,18 @@ public function getController(Request $request)
5757
return false;
5858
}
5959

60-
if (is_array($controller) || (is_object($controller) && method_exists($controller, '__invoke'))) {
60+
if (is_array($controller)) {
6161
return $controller;
6262
}
6363

64+
if (is_object($controller)) {
65+
if (method_exists($controller, '__invoke')) {
66+
return $controller;
67+
}
68+
69+
throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', get_class($controller), $request->getPathInfo()));
70+
}
71+
6472
if (false === strpos($controller, ':')) {
6573
if (method_exists($controller, '__invoke')) {
6674
return new $controller();
@@ -72,7 +80,7 @@ public function getController(Request $request)
7280
$callable = $this->createController($controller);
7381

7482
if (!is_callable($callable)) {
75-
throw new \InvalidArgumentException(sprintf('The controller for URI "%s" is not callable.', $request->getPathInfo()));
83+
throw new \InvalidArgumentException(sprintf('Controller "%s" for URI "%s" is not callable.', $controller, $request->getPathInfo()));
7684
}
7785

7886
return $callable;

src/Symfony/Component/HttpKernel/Tests/Controller/ControllerResolverTest.php

+84-31
Original file line numberDiff line numberDiff line change
@@ -17,66 +17,119 @@
1717

1818
class ControllerResolverTest extends \PHPUnit_Framework_TestCase
1919
{
20-
public function testGetController()
20+
public function testGetControllerWithoutControllerParameter()
2121
{
22-
$logger = new Logger();
22+
$logger = $this->getMock('Psr\Log\LoggerInterface');
23+
$logger->expects($this->once())->method('warning')->with('Unable to look for the controller as the "_controller" parameter is missing');
2324
$resolver = new ControllerResolver($logger);
2425

2526
$request = Request::create('/');
2627
$this->assertFalse($resolver->getController($request), '->getController() returns false when the request has no _controller attribute');
27-
$this->assertEquals(array('Unable to look for the controller as the "_controller" parameter is missing'), $logger->getLogs('warning'));
28+
}
2829

29-
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::testGetController');
30-
$controller = $resolver->getController($request);
31-
$this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller[0], '->getController() returns a PHP callable');
30+
public function testGetControllerWithLambda()
31+
{
32+
$resolver = new ControllerResolver();
3233

34+
$request = Request::create('/');
3335
$request->attributes->set('_controller', $lambda = function () {});
3436
$controller = $resolver->getController($request);
3537
$this->assertSame($lambda, $controller);
38+
}
3639

40+
public function testGetControllerWithObjectAndInvokeMethod()
41+
{
42+
$resolver = new ControllerResolver();
43+
44+
$request = Request::create('/');
3745
$request->attributes->set('_controller', $this);
3846
$controller = $resolver->getController($request);
3947
$this->assertSame($this, $controller);
48+
}
4049

41-
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest');
42-
$controller = $resolver->getController($request);
43-
$this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller);
50+
public function testGetControllerWithObjectAndMethod()
51+
{
52+
$resolver = new ControllerResolver();
4453

54+
$request = Request::create('/');
4555
$request->attributes->set('_controller', array($this, 'controllerMethod1'));
4656
$controller = $resolver->getController($request);
4757
$this->assertSame(array($this, 'controllerMethod1'), $controller);
58+
}
4859

60+
public function testGetControllerWithClassAndMethod()
61+
{
62+
$resolver = new ControllerResolver();
63+
64+
$request = Request::create('/');
4965
$request->attributes->set('_controller', array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'));
5066
$controller = $resolver->getController($request);
5167
$this->assertSame(array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', 'controllerMethod4'), $controller);
68+
}
69+
70+
public function testGetControllerWithObjectAndMethodAsString()
71+
{
72+
$resolver = new ControllerResolver();
73+
74+
$request = Request::create('/');
75+
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::controllerMethod1');
76+
$controller = $resolver->getController($request);
77+
$this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller[0], '->getController() returns a PHP callable');
78+
}
79+
80+
public function testGetControllerWithClassAndInvokeMethod()
81+
{
82+
$resolver = new ControllerResolver();
83+
84+
$request = Request::create('/');
85+
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest');
86+
$controller = $resolver->getController($request);
87+
$this->assertInstanceOf('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest', $controller);
88+
}
89+
90+
/**
91+
* @expectedException \InvalidArgumentException
92+
*/
93+
public function testGetControllerOnObjectWithoutInvokeMethod()
94+
{
95+
$resolver = new ControllerResolver();
96+
97+
$request = Request::create('/');
98+
$request->attributes->set('_controller', new \stdClass());
99+
$resolver->getController($request);
100+
}
101+
102+
public function testGetControllerWithFunction()
103+
{
104+
$resolver = new ControllerResolver();
52105

106+
$request = Request::create('/');
53107
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\some_controller_function');
54108
$controller = $resolver->getController($request);
55109
$this->assertSame('Symfony\Component\HttpKernel\Tests\Controller\some_controller_function', $controller);
110+
}
56111

57-
$request->attributes->set('_controller', 'foo');
58-
try {
59-
$resolver->getController($request);
60-
$this->fail('->getController() throws an \InvalidArgumentException if the _controller attribute is not well-formatted');
61-
} catch (\Exception $e) {
62-
$this->assertInstanceOf('\InvalidArgumentException', $e, '->getController() throws an \InvalidArgumentException if the _controller attribute is not well-formatted');
63-
}
112+
/**
113+
* @dataProvider getUndefinedControllers
114+
* @expectedException \InvalidArgumentException
115+
*/
116+
public function testGetControllerOnNonUndefinedFunction($controller)
117+
{
118+
$resolver = new ControllerResolver();
64119

65-
$request->attributes->set('_controller', 'foo::bar');
66-
try {
67-
$resolver->getController($request);
68-
$this->fail('->getController() throws an \InvalidArgumentException if the _controller attribute contains a non-existent class');
69-
} catch (\Exception $e) {
70-
$this->assertInstanceOf('\InvalidArgumentException', $e, '->getController() throws an \InvalidArgumentException if the _controller attribute contains a non-existent class');
71-
}
120+
$request = Request::create('/');
121+
$request->attributes->set('_controller', $controller);
122+
$resolver->getController($request);
123+
}
72124

73-
$request->attributes->set('_controller', 'Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar');
74-
try {
75-
$resolver->getController($request);
76-
$this->fail('->getController() throws an \InvalidArgumentException if the _controller attribute contains a non-existent method');
77-
} catch (\Exception $e) {
78-
$this->assertInstanceOf('\InvalidArgumentException', $e, '->getController() throws an \InvalidArgumentException if the _controller attribute contains a non-existent method');
79-
}
125+
public function getUndefinedControllers()
126+
{
127+
return array(
128+
array('foo'),
129+
array('foo::bar'),
130+
array('stdClass'),
131+
array('Symfony\Component\HttpKernel\Tests\Controller\ControllerResolverTest::bar'),
132+
);
80133
}
81134

82135
public function testGetArguments()
@@ -158,7 +211,7 @@ public function __invoke($foo, $bar = null)
158211
{
159212
}
160213

161-
protected function controllerMethod1($foo)
214+
public function controllerMethod1($foo)
162215
{
163216
}
164217

0 commit comments

Comments
 (0)