Browse Source

Fix issue where urlencoded URLs would not be matched.

Refs #10219
Mark Story 9 years ago
parent
commit
3009bc4780
2 changed files with 31 additions and 1 deletions
  1. 1 1
      src/Routing/RouteCollection.php
  2. 30 0
      tests/TestCase/Routing/RouteCollectionTest.php

+ 1 - 1
src/Routing/RouteCollection.php

@@ -166,7 +166,7 @@ class RouteCollection
     public function parseRequest(ServerRequestInterface $request)
     public function parseRequest(ServerRequestInterface $request)
     {
     {
         $uri = $request->getUri();
         $uri = $request->getUri();
-        $urlPath = $uri->getPath();
+        $urlPath = urldecode($uri->getPath());
         foreach (array_keys($this->_paths) as $path) {
         foreach (array_keys($this->_paths) as $path) {
             if (strpos($urlPath, $path) !== 0) {
             if (strpos($urlPath, $path) !== 0) {
                 continue;
                 continue;

+ 30 - 0
tests/TestCase/Routing/RouteCollectionTest.php

@@ -150,6 +150,10 @@ class RouteCollectionTest extends TestCase
             '_matchedRoute' => '/ден/:day-:month',
             '_matchedRoute' => '/ден/:day-:month',
         ];
         ];
         $this->assertEquals($expected, $result);
         $this->assertEquals($expected, $result);
+
+        $request = new ServerRequest(['url' => $url]);
+        $result = $this->collection->parseRequest($request);
+        $this->assertEquals($expected, $result);
     }
     }
 
 
     /**
     /**
@@ -350,6 +354,32 @@ class RouteCollectionTest extends TestCase
     }
     }
 
 
     /**
     /**
+     * Test parsing routes that match non-ascii urls
+     *
+     * @return void
+     */
+    public function testParseRequestUnicode()
+    {
+        $routes = new RouteBuilder($this->collection, '/b', []);
+        $routes->connect('/alta/confirmación', ['controller' => 'Media', 'action' => 'confirm']);
+
+        $request = new ServerRequest(['url' => '/b/alta/confirmaci%C3%B3n']);
+        $result = $this->collection->parseRequest($request);
+        $expected = [
+            'controller' => 'Media',
+            'action' => 'confirm',
+            'pass' => [],
+            'plugin' => null,
+            '_matchedRoute' => '/b/alta/confirmación',
+        ];
+        $this->assertEquals($expected, $result);
+
+        $request = new ServerRequest(['url' => '/b/alta/confirmación']);
+        $result = $this->collection->parseRequest($request);
+        $this->assertEquals($expected, $result);
+    }
+
+    /**
      * Test match() throws an error on unknown routes.
      * Test match() throws an error on unknown routes.
      *
      *
      * @expectedException \Cake\Routing\Exception\MissingRouteException
      * @expectedException \Cake\Routing\Exception\MissingRouteException