diff --git a/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
index 03528fefa9..e81110dc01 100644
--- a/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
+++ b/src/Symfony/Component/DependencyInjection/Compiler/CheckCircularReferencesPass.php
@@ -28,6 +28,7 @@ class CheckCircularReferencesPass implements CompilerPassInterface
{
private $currentId;
private $currentPath;
+ private $checkedNodes;
/**
* Checks the ContainerBuilder object for circular references.
@@ -38,6 +39,7 @@ class CheckCircularReferencesPass implements CompilerPassInterface
{
$graph = $container->getCompiler()->getServiceReferenceGraph();
+ $this->checkedNodes = array();
foreach ($graph->getNodes() as $id => $node) {
$this->currentId = $id;
$this->currentPath = array($id);
@@ -58,15 +60,20 @@ class CheckCircularReferencesPass implements CompilerPassInterface
foreach ($edges as $edge) {
$node = $edge->getDestNode();
$id = $node->getId();
- $searchKey = array_search($id, $this->currentPath);
- $this->currentPath[] = $id;
- if (false !== $searchKey) {
- throw new ServiceCircularReferenceException($id, array_slice($this->currentPath, $searchKey));
+ if (empty($this->checkedNodes[$id])) {
+ $searchKey = array_search($id, $this->currentPath);
+ $this->currentPath[] = $id;
+
+ if (false !== $searchKey) {
+ throw new ServiceCircularReferenceException($id, array_slice($this->currentPath, $searchKey));
+ }
+
+ $this->checkOutEdges($node->getOutEdges());
+
+ $this->checkedNodes[$id] = true;
+ array_pop($this->currentPath);
}
-
- $this->checkOutEdges($node->getOutEdges());
- array_pop($this->currentPath);
}
}
}
diff --git a/src/Symfony/Component/HttpFoundation/Request.php b/src/Symfony/Component/HttpFoundation/Request.php
index 72ff73eef7..a937f03d8f 100644
--- a/src/Symfony/Component/HttpFoundation/Request.php
+++ b/src/Symfony/Component/HttpFoundation/Request.php
@@ -726,9 +726,9 @@ class Request
/**
* Returns the client IP addresses.
*
- * The most trusted IP address is first, and the less trusted one last.
- * The "real" client IP address is the last one, but this is also the
- * less trusted one.
+ * The least trusted IP address is first, and the most trusted one last.
+ * The "real" client IP address is the first one, but this is also the
+ * least trusted one.
*
* Use this method carefully; you should use getClientIp() instead.
*
diff --git a/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php
index 96b28ca86b..7d6a2f5c75 100644
--- a/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php
+++ b/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php
@@ -68,7 +68,7 @@ class InlineFragmentRenderer extends RoutableFragmentRenderer
}
}
- $uri = $this->generateFragmentUri($uri, $request, false);
+ $uri = $this->generateFragmentUri($uri, $request, false, false);
$reference->attributes = array_merge($attributes, $reference->attributes);
}
diff --git a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php
index 668326a239..bdf710b27a 100644
--- a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php
+++ b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php
@@ -41,11 +41,12 @@ abstract class RoutableFragmentRenderer implements FragmentRendererInterface
*
* @param ControllerReference $reference A ControllerReference instance
* @param Request $request A Request instance
+ * @param Boolean $absolute Whether to generate an absolute URL or not
* @param Boolean $strict Whether to allow non-scalar attributes or not
*
* @return string A fragment URI
*/
- protected function generateFragmentUri(ControllerReference $reference, Request $request, $strict = true)
+ protected function generateFragmentUri(ControllerReference $reference, Request $request, $absolute = false, $strict = true)
{
if ($strict) {
$this->checkNonScalar($reference->attributes);
@@ -67,7 +68,13 @@ abstract class RoutableFragmentRenderer implements FragmentRendererInterface
$reference->query['_path'] = http_build_query($reference->attributes, '', '&');
- return $request->getUriForPath($this->fragmentPath.'?'.http_build_query($reference->query, '', '&'));
+ $path = $this->fragmentPath.'?'.http_build_query($reference->query, '', '&');
+
+ if ($absolute) {
+ return $request->getUriForPath($path);
+ }
+
+ return $request->getBaseUrl().$path;
}
private function checkNonScalar($values)
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
index 4027c78f10..eee169738e 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php
@@ -41,7 +41,7 @@ class EsiFragmentRendererTest extends \PHPUnit_Framework_TestCase
$this->assertEquals('', $strategy->render('/', $request)->getContent());
$this->assertEquals("\n", $strategy->render('/', $request, array('comment' => 'This is a comment'))->getContent());
$this->assertEquals('', $strategy->render('/', $request, array('alt' => 'foo'))->getContent());
- $this->assertEquals('', $strategy->render(new ControllerReference('main_controller', array(), array()), $request, array('alt' => new ControllerReference('alt_controller', array(), array())))->getContent());
+ $this->assertEquals('', $strategy->render(new ControllerReference('main_controller', array(), array()), $request, array('alt' => new ControllerReference('alt_controller', array(), array())))->getContent());
}
private function getInlineStrategy($called = false)
diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
index 43a187f1d5..92434c6b6d 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/HIncludeFragmentRendererTest.php
@@ -31,7 +31,7 @@ class HIncludeFragmentRendererTest extends \PHPUnit_Framework_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/RoutableFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php
index e54444131d..ce23d98a4f 100644
--- a/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php
+++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php
@@ -24,15 +24,23 @@ class RoutableFragmentRendererTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/')));
}
+ /**
+ * @dataProvider getGenerateFragmentUriData
+ */
+ public function testGenerateAbsoluteFragmentUri($uri, $controller)
+ {
+ $this->assertEquals('http://localhost'.$uri, $this->callGenerateFragmentUriMethod($controller, Request::create('/'), true));
+ }
+
public function getGenerateFragmentUriData()
{
return array(
- array('http://localhost/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array())),
- array('http://localhost/_fragment?_path=_format%3Dxml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('_format' => 'xml'), array())),
- array('http://localhost/_fragment?_path=foo%3Dfoo%26_format%3Djson%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo', '_format' => 'json'), array())),
- array('http://localhost/_fragment?bar=bar&_path=foo%3Dfoo%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo'), array('bar' => 'bar'))),
- array('http://localhost/_fragment?foo=foo&_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array('foo' => 'foo'))),
- array('http://localhost/_fragment?_path=foo%255B0%255D%3Dfoo%26foo%255B1%255D%3Dbar%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => array('foo', 'bar')), array())),
+ array('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array())),
+ array('/_fragment?_path=_format%3Dxml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('_format' => 'xml'), array())),
+ array('/_fragment?_path=foo%3Dfoo%26_format%3Djson%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo', '_format' => 'json'), array())),
+ array('/_fragment?bar=bar&_path=foo%3Dfoo%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => 'foo'), array('bar' => 'bar'))),
+ array('/_fragment?foo=foo&_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array(), array('foo' => 'foo'))),
+ array('/_fragment?_path=foo%255B0%255D%3Dfoo%26foo%255B1%255D%3Dbar%26_format%3Dhtml%26_locale%3Den%26_controller%3Dcontroller', new ControllerReference('controller', array('foo' => array('foo', 'bar')), array())),
);
}
@@ -43,7 +51,7 @@ class RoutableFragmentRendererTest extends \PHPUnit_Framework_TestCase
$request->setLocale('fr');
$controller = new ControllerReference('controller', array(), array());
- $this->assertEquals('http://localhost/_fragment?_path=_format%3Djson%26_locale%3Dfr%26_controller%3Dcontroller', $this->callGenerateFragmentUriMethod($controller, $request));
+ $this->assertEquals('/_fragment?_path=_format%3Djson%26_locale%3Dfr%26_controller%3Dcontroller', $this->callGenerateFragmentUriMethod($controller, $request));
}
/**
@@ -63,14 +71,14 @@ class RoutableFragmentRendererTest extends \PHPUnit_Framework_TestCase
);
}
- private function callGenerateFragmentUriMethod(ControllerReference $reference, Request $request)
+ private function callGenerateFragmentUriMethod(ControllerReference $reference, Request $request, $absolute = false)
{
$renderer = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\Fragment\RoutableFragmentRenderer');
$r = new \ReflectionObject($renderer);
$m = $r->getMethod('generateFragmentUri');
$m->setAccessible(true);
- return $m->invoke($renderer, $reference, $request);
+ return $m->invoke($renderer, $reference, $request, $absolute);
}
}
@@ -82,4 +90,9 @@ class Foo
{
return $this->foo;
}
+
+ public function doGenerateFragmentUri(ControllerReference $reference, Request $request, $absolute = false, $strict = true)
+ {
+ return parent::generateFragmentUri($reference, $request, $absolute, $strict);
+ }
}
diff --git a/src/Symfony/Component/Process/Process.php b/src/Symfony/Component/Process/Process.php
index 6fdbe4b8e9..87a978d772 100644
--- a/src/Symfony/Component/Process/Process.php
+++ b/src/Symfony/Component/Process/Process.php
@@ -268,8 +268,8 @@ class Process
*
* @return Process The new process
*
- * @throws \RuntimeException When process can't be launch or is stopped
- * @throws \RuntimeException When process is already running
+ * @throws RuntimeException When process can't be launch or is stopped
+ * @throws RuntimeException When process is already running
*
* @see start()
*/
@@ -296,8 +296,8 @@ class Process
*
* @return integer The exitcode of the process
*
- * @throws \RuntimeException When process timed out
- * @throws \RuntimeException When process stopped after receiving signal
+ * @throws RuntimeException When process timed out
+ * @throws RuntimeException When process stopped after receiving signal
*/
public function wait($callback = null)
{
diff --git a/src/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php b/src/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php
index b216502a71..b46b1bc3cf 100644
--- a/src/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php
+++ b/src/Symfony/Component/Security/Http/Firewall/SwitchUserListener.php
@@ -68,11 +68,11 @@ class SwitchUserListener implements ListenerInterface
}
/**
- * Handles digest authentication.
+ * Handles the switch to another user.
*
* @param GetResponseEvent $event A GetResponseEvent instance
*
- * @throws \LogicException
+ * @throws \LogicException if switching to a user failed
*/
public function handle(GetResponseEvent $event)
{