Просмотр исходного кода

ZF-8469 urlencode param values in assemble(); urldecode id param value in match()

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@19880 44c647ce-9c0f-0410-b52a-842ac1e357ba
lcrouch 16 лет назад
Родитель
Сommit
50e40db967
2 измененных файлов с 31 добавлено и 1 удалено
  1. 2 1
      library/Zend/Rest/Route.php
  2. 29 0
      tests/Zend/Rest/RouteTest.php

+ 2 - 1
library/Zend/Rest/Route.php

@@ -157,7 +157,7 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module
                 $specialGetTarget = 'edit';
                 $params['id'] = $path[$pathElementCount-2];
             } elseif ($pathElementCount == 1) {
-                $params['id'] = array_shift($path);
+                $params['id'] = urldecode(array_shift($path));
             } elseif ($pathElementCount == 0 || $pathElementCount > 1) {
                 $specialGetTarget = 'index';
             }
@@ -259,6 +259,7 @@ class Zend_Rest_Route extends Zend_Controller_Router_Route_Module
             unset($params['index']);
             $url .= '/index';
             foreach ($params as $key => $value) {
+                if ($encode) $value = urlencode($value);
                 $url .= '/' . $key . '/' . $value;
             }
         } elseif (isset($params['id'])) {

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

@@ -163,6 +163,19 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $this->assertEquals('zendframework', $values['id']);
     }
 
+    public function test_RESTfulApp_GET_project_byIdentifier_urlencoded()
+    {
+        $request = $this->_buildRequest('GET', '/project/zend+framework');
+        $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('zend framework', $values['id']);
+    }
+    
     public function test_RESTfulApp_GET_project_edit()
     {
         $request = $this->_buildRequest('GET', '/project/zendframework/edit');
@@ -485,7 +498,23 @@ class Zend_Rest_RouteTest extends PHPUnit_Framework_TestCase
         $url = $route->assemble($params);
         $this->assertEquals('mod/user/index/foo/bar', $url);
     }
+    
+    public function test_assemble_encode_param_values()
+    {
+        $route = new Zend_Rest_Route($this->_front, array(), array());
+        $params = array('module'=>'mod', 'controller'=>'user', 'index'=>true, 'foo'=>'bar is n!ice');
+        $url = $route->assemble($params);
+        $this->assertEquals('mod/user/index/foo/bar+is+n%21ice', $url);
+    }
 
+    public function test_assemble_does_NOT_encode_param_values()
+    {
+        $route = new Zend_Rest_Route($this->_front, array(), array());
+        $params = array('module'=>'mod', 'controller'=>'user', 'index'=>true, 'foo'=>'bar is n!ice');
+        $url = $route->assemble($params, false, false);
+        $this->assertEquals('mod/user/index/foo/bar is n!ice', $url);
+    }
+    
     private function _buildRequest($method, $uri)
     {
         $request = new Zend_Controller_Request_HttpTestCase();