diff --git a/src/Http/Middleware/RoutingMiddleware.php b/src/Http/Middleware/RoutingMiddleware.php new file mode 100644 index 00000000000..67e76166874 --- /dev/null +++ b/src/Http/Middleware/RoutingMiddleware.php @@ -0,0 +1,53 @@ +getAttribute('params', []); + if (empty($params['controller'])) { + $path = $request->getUri()->getPath(); + $request = $request->withAttribute('params', Router::parse($path, $request->getMethod())); + } + } catch (RedirectException $e) { + return new RedirectResponse( + $e->getMessage(), + $e->getCode(), + $response->getHeaders() + ); + } + return $next($request, $response); + } +} diff --git a/tests/TestCase/Http/Middleware/RoutingMiddlewareTest.php b/tests/TestCase/Http/Middleware/RoutingMiddlewareTest.php new file mode 100644 index 00000000000..068d24603b5 --- /dev/null +++ b/tests/TestCase/Http/Middleware/RoutingMiddlewareTest.php @@ -0,0 +1,133 @@ + 'Articles', 'action' => 'index']); + } + + /** + * Test redirect responses from redirect routes + * + * @return void + */ + public function testRedirectResponse() + { + Router::redirect('/testpath', '/pages'); + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/testpath']); + $response = new Response(); + $next = function ($req, $res) { + }; + $middleware = new RoutingMiddleware(); + $response = $middleware($request, $response, $next); + + $this->assertEquals(301, $response->getStatusCode()); + $this->assertEquals('http://localhost/pages', $response->getHeaderLine('Location')); + } + + /** + * Test redirects with additional headers + * + * @return void + */ + public function testRedirectResponseWithHeaders() + { + Router::redirect('/testpath', '/pages'); + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/testpath']); + $response = new Response('php://memory', 200, ['X-testing' => 'Yes']); + $next = function ($req, $res) { + }; + $middleware = new RoutingMiddleware(); + $response = $middleware($request, $response, $next); + + $this->assertEquals(301, $response->getStatusCode()); + $this->assertEquals('http://localhost/pages', $response->getHeaderLine('Location')); + $this->assertEquals('Yes', $response->getHeaderLine('X-testing')); + } + + /** + * Test that Router sets parameters + * + * @return void + */ + public function testRouterSetParams() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']); + $response = new Response(); + $next = function ($req, $res) { + $expected = [ + 'controller' => 'Articles', + 'action' => 'index', + 'plugin' => null, + 'pass' => [] + ]; + $this->assertEquals($expected, $req->getAttribute('params')); + }; + $middleware = new RoutingMiddleware(); + $middleware($request, $response, $next); + } + + /** + * Test that routing is not applied if a controller exists already + * + * @return void + */ + public function testRouterNoopOnController() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/articles']); + $request = $request->withAttribute('params', ['controller' => 'Articles']); + $response = new Response(); + $next = function ($req, $res) { + $this->assertEquals(['controller' => 'Articles'], $req->getAttribute('params')); + }; + $middleware = new RoutingMiddleware(); + $middleware($request, $response, $next); + } + + /** + * Test missing routes not being caught. + * + * @expectedException \Cake\Routing\Exception\MissingRouteException + */ + public function testMissingRouteNotCaught() + { + $request = ServerRequestFactory::fromGlobals(['REQUEST_URI' => '/missing']); + $response = new Response(); + $next = function ($req, $res) { + }; + $middleware = new RoutingMiddleware(); + $middleware($request, $response, $next); + } +}