From 38e9623ca4bf1a60009141f1a0f895be621da8ec Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Thu, 9 Oct 2014 14:30:02 +0200 Subject: [PATCH 1/3] don't raise warnings when exception is thrown `array_map()` raises a warning when an exception is thrown inside the callback (see https://bugs.php.net/bug.php?id=55416). To avoid these warnings, `selectorToXPath()` is applied inside the loop. --- src/Symfony/Component/CssSelector/XPath/Translator.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/CssSelector/XPath/Translator.php b/src/Symfony/Component/CssSelector/XPath/Translator.php index 4676677ea4..5675aa6106 100644 --- a/src/Symfony/Component/CssSelector/XPath/Translator.php +++ b/src/Symfony/Component/CssSelector/XPath/Translator.php @@ -123,17 +123,15 @@ class Translator implements TranslatorInterface $selectors = $this->parseSelectors($cssExpr); /** @var SelectorNode $selector */ - foreach ($selectors as $selector) { + foreach ($selectors as $index => $selector) { if (null !== $selector->getPseudoElement()) { throw new ExpressionErrorException('Pseudo-elements are not supported.'); } + + $selectors[$index] = $this->selectorToXPath($selector, $prefix); } - $translator = $this; - - return implode(' | ', array_map(function (SelectorNode $selector) use ($translator, $prefix) { - return $translator->selectorToXPath($selector, $prefix); - }, $selectors)); + return implode(' | ', $selectors); } /** From f61607f5cb56c5534e245f480f86215fbc945a13 Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Wed, 18 Sep 2013 19:34:08 +0200 Subject: [PATCH 2/3] [Routing] fix inconsistencies in RequestContext --- .../Component/Routing/RequestContext.php | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/src/Symfony/Component/Routing/RequestContext.php b/src/Symfony/Component/Routing/RequestContext.php index 93fd09ad5b..c8fcf445dd 100644 --- a/src/Symfony/Component/Routing/RequestContext.php +++ b/src/Symfony/Component/Routing/RequestContext.php @@ -17,6 +17,7 @@ use Symfony\Component\HttpFoundation\Request; * Holds information about the current request. * * @author Fabien Potencier + * @author Tobias Schultze * * @api */ @@ -52,16 +53,21 @@ class RequestContext */ public function __construct($baseUrl = '', $method = 'GET', $host = 'localhost', $scheme = 'http', $httpPort = 80, $httpsPort = 443, $path = '/', $queryString = '') { - $this->baseUrl = $baseUrl; - $this->method = strtoupper($method); - $this->host = $host; - $this->scheme = strtolower($scheme); - $this->httpPort = $httpPort; - $this->httpsPort = $httpsPort; - $this->pathInfo = $path; - $this->queryString = $queryString; + $this->setBaseUrl($baseUrl); + $this->setMethod($method); + $this->setHost($host); + $this->setScheme($scheme); + $this->setHttpPort($httpPort); + $this->setHttpsPort($httpsPort); + $this->setPathInfo($path); + $this->setQueryString($queryString); } + /** + * Updates the RequestContext information based on a HttpFoundation Request. + * + * @param Request $request A Request instance + */ public function fromRequest(Request $request) { $this->setBaseUrl($request->getBaseUrl()); @@ -71,7 +77,7 @@ class RequestContext $this->setScheme($request->getScheme()); $this->setHttpPort($request->isSecure() ? $this->httpPort : $request->getPort()); $this->setHttpsPort($request->isSecure() ? $request->getPort() : $this->httpsPort); - $this->setQueryString($request->server->get('QUERY_STRING')); + $this->setQueryString($request->server->get('QUERY_STRING', '')); } /** @@ -143,6 +149,8 @@ class RequestContext /** * Gets the HTTP host. * + * The host is always lowercased because it must be treated case-insensitive. + * * @return string The HTTP host */ public function getHost() @@ -159,7 +167,7 @@ class RequestContext */ public function setHost($host) { - $this->host = $host; + $this->host = strtolower($host); } /** @@ -187,7 +195,7 @@ class RequestContext /** * Gets the HTTP port. * - * @return string The HTTP port + * @return int The HTTP port */ public function getHttpPort() { @@ -197,19 +205,19 @@ class RequestContext /** * Sets the HTTP port. * - * @param string $httpPort The HTTP port + * @param int $httpPort The HTTP port * * @api */ public function setHttpPort($httpPort) { - $this->httpPort = $httpPort; + $this->httpPort = (int) $httpPort; } /** * Gets the HTTPS port. * - * @return string The HTTPS port + * @return int The HTTPS port */ public function getHttpsPort() { @@ -219,19 +227,19 @@ class RequestContext /** * Sets the HTTPS port. * - * @param string $httpsPort The HTTPS port + * @param int $httpsPort The HTTPS port * * @api */ public function setHttpsPort($httpsPort) { - $this->httpsPort = $httpsPort; + $this->httpsPort = (int) $httpsPort; } /** * Gets the query string. * - * @return string The query string + * @return string The query string without the "?" */ public function getQueryString() { @@ -241,13 +249,14 @@ class RequestContext /** * Sets the query string. * - * @param string $queryString The query string + * @param string $queryString The query string (after "?") * * @api */ public function setQueryString($queryString) { - $this->queryString = $queryString; + // string cast to be fault-tolerant, accepting null + $this->queryString = (string) $queryString; } /** @@ -263,11 +272,9 @@ class RequestContext /** * Sets the parameters. * - * This method implements a fluent interface. - * * @param array $parameters The parameters * - * @return Route The current Route instance + * @return RequestContext The current instance, implementing a fluent interface */ public function setParameters(array $parameters) { @@ -281,7 +288,7 @@ class RequestContext * * @param string $name A parameter name * - * @return mixed The parameter value + * @return mixed The parameter value or null if nonexistent */ public function getParameter($name) { @@ -293,7 +300,7 @@ class RequestContext * * @param string $name A parameter name * - * @return bool true if the parameter value is set, false otherwise + * @return bool True if the parameter value is set, false otherwise */ public function hasParameter($name) { From 676c4a02538d15bfceed63d2c4201627d354011d Mon Sep 17 00:00:00 2001 From: Tobias Schultze Date: Wed, 8 Oct 2014 23:59:43 +0200 Subject: [PATCH 3/3] [Routing] add tests for RequestContext --- .../Routing/Tests/RequestContextTest.php | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/Symfony/Component/Routing/Tests/RequestContextTest.php b/src/Symfony/Component/Routing/Tests/RequestContextTest.php index 21a299956f..98fac0b721 100644 --- a/src/Symfony/Component/Routing/Tests/RequestContextTest.php +++ b/src/Symfony/Component/Routing/Tests/RequestContextTest.php @@ -98,4 +98,46 @@ class RequestContextTest extends \PHPUnit_Framework_TestCase $this->assertEquals('bar', $requestContext->getParameter('foo')); } + + public function testMethod() + { + $requestContext = new RequestContext(); + $requestContext->setMethod('post'); + + $this->assertSame('POST', $requestContext->getMethod()); + } + + public function testScheme() + { + $requestContext = new RequestContext(); + $requestContext->setScheme('HTTPS'); + + $this->assertSame('https', $requestContext->getScheme()); + } + + public function testHost() + { + $requestContext = new RequestContext(); + $requestContext->setHost('eXampLe.com'); + + $this->assertSame('example.com', $requestContext->getHost()); + } + + public function testQueryString() + { + $requestContext = new RequestContext(); + $requestContext->setQueryString(null); + + $this->assertSame('', $requestContext->getQueryString()); + } + + public function testPort() + { + $requestContext = new RequestContext(); + $requestContext->setHttpPort('123'); + $requestContext->setHttpsPort('456'); + + $this->assertSame(123, $requestContext->getHttpPort()); + $this->assertSame(456, $requestContext->getHttpsPort()); + } }