Kaynağa Gözat

ZF-10964: Remove duplicate urldecode calls and add related unit tests

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23687 44c647ce-9c0f-0410-b52a-842ac1e357ba
bradley.holt 15 yıl önce
ebeveyn
işleme
95199c46be
2 değiştirilmiş dosya ile 274 ekleme ve 3 silme
  1. 3 3
      library/Zend/Rest/Route.php
  2. 271 0
      tests/Zend/Rest/RouteTest.php

+ 3 - 3
library/Zend/Rest/Route.php

@@ -178,7 +178,7 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module
                 $specialGetTarget = 'edit';
                 $params['id'] = $path[$pathElementCount-2];
             } elseif ($pathElementCount == 1) {
-                $params['id'] = urldecode(array_shift($path));
+                $params['id'] = array_shift($path);
             } elseif ($pathElementCount == 0 && !isset($params['id'])) {
                 $specialGetTarget = 'index';
             }
@@ -186,8 +186,8 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module
             // Digest URI params
             if ($numSegs = count($path)) {
                 for ($i = 0; $i < $numSegs; $i = $i + 2) {
-                    $key = urldecode($path[$i]);
-                    $val = isset($path[$i + 1]) ? urldecode($path[$i + 1]) : null;
+                    $key = $path[$i];
+                    $val = isset($path[$i + 1]) ? $path[$i + 1] : null;
                     $params[$key] = $val;
                 }
             }

+ 271 - 0
tests/Zend/Rest/RouteTest.php

@@ -185,6 +185,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('active', $values['status']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_GET_user_index_withParam_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/user/index/the%2Bemail%40address/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('default', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('index', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['the+email@address']);
+    }
+
     public function test_RESTfulApp_GET_project_byIdentifier()
     {
         $request = $this->_buildRequest('GET', '/project/zendframework');
@@ -224,6 +240,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('zend framework', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_GET_project_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/project/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('default', $values['module']);
+        $this->assertEquals('project', $values['controller']);
+        $this->assertEquals('get', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_HEAD_project_byIdentifier()
     {
         $request = $this->_buildRequest('HEAD', '/project/lcrouch');
@@ -236,6 +268,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('head', $values['action']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_HEAD_project_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('HEAD', '/project/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('default', $values['module']);
+        $this->assertEquals('project', $values['controller']);
+        $this->assertEquals('head', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_GET_project_edit()
     {
         $request = $this->_buildRequest('GET', '/project/zendframework/edit');
@@ -249,6 +297,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('zendframework', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_GET_project_edit_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/project/email%2Btest%40example.com/edit');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('default', $values['module']);
+        $this->assertEquals('project', $values['controller']);
+        $this->assertEquals('edit', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_PUT_user_byIdentifier()
     {
         $request = $this->_buildRequest('PUT', '/mod/user/lcrouch');
@@ -262,6 +326,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_PUT_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('PUT', '/mod/user/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('put', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_POST_user()
     {
         $request = $this->_buildRequest('POST', '/mod/user');
@@ -287,6 +367,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_DELETE_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('DELETE', '/mod/user/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('delete', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_POST_user_with_identifier_doesPUT()
     {
         $request = $this->_buildRequest('POST', '/mod/user/lcrouch');
@@ -300,6 +396,22 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_POST_user_with_identifier_urlencodedWithPlusSymbol_doesPUT()
+    {
+        $request = $this->_buildRequest('POST', '/mod/user/email%2Btest%40example.com');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('put', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_overload_POST_with_method_param_PUT()
     {
         $request = $this->_buildRequest('POST', '/mod/user');
@@ -327,6 +439,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_overload_POST_with_http_header_DELETE_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('POST', '/mod/user/email%2Btest%40example.com');
+        $request->setHeader('X-HTTP-Method-Override', 'DELETE');
+        $values = $this->_invokeRouteMatch($request);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('delete', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulApp_route_chaining()
     {
         $request = $this->_buildRequest('GET', '/api/user/lcrouch');
@@ -347,6 +476,29 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals("lcrouch", $routedRequest->getParam("id"));
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulApp_route_chaining_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/api/user/email%2Btest%40example.com');
+        $this->_front->setRequest($request);
+
+        $router = $this->_front->getRouter();
+        $router->removeDefaultRoutes();
+
+        $nonRESTRoute = new Zend_Controller_Router_Route('api');
+        $RESTRoute = new Zend_Rest_Route($this->_front);
+        $router->addRoute("api", $nonRESTRoute->chain($RESTRoute));
+
+        $routedRequest = $router->route($request);
+
+        $this->assertEquals("default", $routedRequest->getParam("module"));
+        $this->assertEquals("user", $routedRequest->getParam("controller"));
+        $this->assertEquals("get", $routedRequest->getParam("action"));
+        $this->assertEquals("email+test@example.com", $routedRequest->getParam("id"));
+    }
+
     public function test_RESTfulModule_GET_user_index()
     {
         $request = $this->_buildRequest('GET', '/mod/user/index');
@@ -360,6 +512,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('index', $values['action']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulModule_GET_user_index_withParam_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/mod/user/index/the%2Bemail%40address/email%2Btest%40example.com');
+        $config = array('mod');
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('index', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['the+email@address']);
+    }
+
     public function test_RESTfulModule_GET_user()
     {
         $request = $this->_buildRequest('GET', '/mod/user/1234');
@@ -373,6 +542,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('get', $values['action']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulModule_GET_user_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod');
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('get', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulModule_POST_user()
     {
         $request = $this->_buildRequest('POST', '/mod/user');
@@ -409,6 +595,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulModule_PUT_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('PUT', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod');
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('put', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulModule_DELETE_user_byIdentifier()
     {
         $request = $this->_buildRequest('DELETE', '/mod/user/lcrouch');
@@ -423,6 +626,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulModule_DELETE_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('DELETE', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod');
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('delete', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulController_GET_user_index()
     {
         $request = $this->_buildRequest('GET', '/mod/user/index');
@@ -467,6 +687,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('get', $values['action']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulController_GET_user_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('GET', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod'=>array('user'));
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('get', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulController_POST_user()
     {
         $request = $this->_buildRequest('POST', '/mod/user');
@@ -521,6 +758,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulController_PUT_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('PUT', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod'=>array('user'));
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('put', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_RESTfulController_DELETE_user_byIdentifier()
     {
         $request = $this->_buildRequest('DELETE', '/mod/user/lcrouch');
@@ -535,6 +789,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('lcrouch', $values['id']);
     }
 
+    /**
+     * @group ZF-10964
+     */
+    public function test_RESTfulController_DELETE_user_byIdentifier_urlencodedWithPlusSymbol()
+    {
+        $request = $this->_buildRequest('DELETE', '/mod/user/email%2Btest%40example.com');
+        $config = array('mod');
+        $values = $this->_invokeRouteMatch($request, $config);
+
+        $this->assertType('array', $values);
+        $this->assertTrue(isset($values['module']));
+        $this->assertEquals('mod', $values['module']);
+        $this->assertEquals('user', $values['controller']);
+        $this->assertEquals('delete', $values['action']);
+        $this->assertEquals('email+test@example.com', $values['id']);
+    }
+
     public function test_assemble_plain_ignores_action()
     {
         $route = new Zend_Rest_Route($this->_front, array(), array());