diff --git a/src/EventSubscriber/RouteNormalizerRequestSubscriber.php b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php index 16724b5..01a9ce8 100644 --- a/src/EventSubscriber/RouteNormalizerRequestSubscriber.php +++ b/src/EventSubscriber/RouteNormalizerRequestSubscriber.php @@ -88,16 +88,12 @@ class RouteNormalizerRequestSubscriber implements EventSubscriberInterface { */ public function onKernelRequestRedirect(GetResponseEvent $event) { - if (!$this->config->get('route_normalizer_enabled')) { - return; - } - - if (!$event->isMasterRequest()) { + if (!$this->config->get('route_normalizer_enabled') || !$event->isMasterRequest()) { return; } $request = $event->getRequest(); - if ($request->attributes->get('_disable_route_normalizer')) { + if ($request->attributes->get('_disable_route_normalizer') || $request->get('_route') == 'image.style_public') { return; } diff --git a/src/RedirectChecker.php b/src/RedirectChecker.php index 4602d30..02da7ad 100644 --- a/src/RedirectChecker.php +++ b/src/RedirectChecker.php @@ -87,9 +87,6 @@ class RedirectChecker { elseif ($request->query->has('destination')) { $can_redirect = FALSE; } - elseif ($request->get('_route') == 'image.style_public') { - $can_redirect = FALSE; - } elseif ($this->config->get('ignore_admin_path') && isset($route)) { // Do not redirect on admin paths. $can_redirect &= !(bool) $route->getOption('_admin_route'); diff --git a/src/Tests/GlobalRedirectTest.php b/src/Tests/GlobalRedirectTest.php index 96f7cc1..fcf129c 100644 --- a/src/Tests/GlobalRedirectTest.php +++ b/src/Tests/GlobalRedirectTest.php @@ -133,6 +133,15 @@ class GlobalRedirectTest extends WebTestBase { */ public function testRedirects() { + // First test that the good stuff can be switched off. + $this->config->set('route_normalizer_enabled', FALSE)->save(); + $this->assertRedirect('index.php/node/' . $this->node->id(), NULL, 'HTTP/1.1 200 OK'); + $this->assertRedirect('index.php/test-node', NULL, 'HTTP/1.1 200 OK'); + $this->assertRedirect('test-node/', NULL, 'HTTP/1.1 200 OK'); + $this->assertRedirect('Test-node/', NULL, 'HTTP/1.1 200 OK'); + + $this->config->set('route_normalizer_enabled', TRUE)->save(); + // Test alias normalization. $this->assertRedirect('node/' . $this->node->id(), 'test-node'); $this->assertRedirect('Test-node', 'test-node'); diff --git a/tests/src/Unit/RedirectCheckerTest.php b/tests/src/Unit/RedirectCheckerTest.php index 287945b..35f8233 100644 --- a/tests/src/Unit/RedirectCheckerTest.php +++ b/tests/src/Unit/RedirectCheckerTest.php @@ -63,22 +63,27 @@ class RedirectCheckerTest extends UnitTestCase { $request = $this->getRequestStub('index.php', 'POST'); $this->assertFalse($checker->canRedirect($request), 'Cannot redirect other than GET method'); - // Maintenance mode is on. - $state = $this->getMockBuilder('Drupal\Core\State\StateInterface') - ->getMock(); - $state->expects($this->any()) - ->method('get') - ->with('system.maintenance_mode') - ->will($this->returnValue(TRUE)); // Route access check, deny access. $request = $this->getRequestStub('index.php', 'GET'); $this->assertFalse($checker->canRedirect($request, 'denied_route'), 'Can not redirect'); - // Route access check, deny access. + // Route access check, allow access. $request = $this->getRequestStub('index.php', 'GET'); $this->assertTrue($checker->canRedirect($request, 'allowed_route'), 'Can redirect'); + // Check destination parameter. + $request = $this->getRequestStub('index.php', 'GET', [], ['destination' => 'paradise']); + $this->assertFalse($checker->canRedirect($request), 'Cannot redirect'); + + // Maintenance mode is on. + $state = $this->getMockBuilder('Drupal\Core\State\StateInterface') + ->getMock(); + $state->expects($this->any()) + ->method('get') + ->with('system.maintenance_mode') + ->will($this->returnValue(TRUE)); + $checker = new RedirectChecker($this->getConfigFactoryStub($config), $state, $access, $account, $route_provider); $request = $this->getRequestStub('index.php', 'GET'); @@ -118,16 +123,19 @@ class RedirectCheckerTest extends UnitTestCase { /** * Gets request mock object. * - * @param $script_name + * @param string $script_name * The result of the getScriptName() method. - * @param $method + * @param string $method * The request method. * @param array $attributes * Attributes to be passed into request->attributes. + * @param array $query + * Query paramter to be passed into request->query. * * @return PHPUnit_Framework_MockObject_MockObject + * Mocked request object. */ - protected function getRequestStub($script_name, $method, array $attributes = array()) { + protected function getRequestStub($script_name, $method, array $attributes = [], array $query = []) { $request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request') ->disableOriginalConstructor() ->getMock(); @@ -138,7 +146,7 @@ class RedirectCheckerTest extends UnitTestCase { ->method('isMethod') ->with($this->anything()) ->will($this->returnValue($method == 'GET')); - $request->query = new ParameterBag([]); + $request->query = new ParameterBag($query); $request->attributes = new ParameterBag($attributes); return $request;