Преглед изворни кода

Fixes #187 - Zend_Rest_Server does not properly handle optional parameters

Frank Brückner пре 11 година
родитељ
комит
3f7b1c992a
2 измењених фајлова са 41 додато и 6 уклоњено
  1. 11 4
      library/Zend/Rest/Server.php
  2. 30 2
      tests/Zend/Rest/ServerTest.php

+ 11 - 4
library/Zend/Rest/Server.php

@@ -189,28 +189,35 @@ class Zend_Rest_Server implements Zend_Server_Interface
 
 
                     $func_args = $this->_functions[$this->_method]->getParameters();
                     $func_args = $this->_functions[$this->_method]->getParameters();
 
 
+                    // calling_args will be a zero-based array of the parameters
                     $calling_args = array();
                     $calling_args = array();
                     $missing_args = array();
                     $missing_args = array();
-                    foreach ($func_args as $arg) {
+                    foreach ($func_args as $i => $arg) {
                         if (isset($request[strtolower($arg->getName())])) {
                         if (isset($request[strtolower($arg->getName())])) {
-                            $calling_args[] = $request[strtolower($arg->getName())];
+                            $calling_args[$i] = $request[strtolower($arg->getName())];
                         } elseif ($arg->isOptional()) {
                         } elseif ($arg->isOptional()) {
-                            $calling_args[] = $arg->getDefaultValue();
+                            $calling_args[$i] = $arg->getDefaultValue();
                         } else {
                         } else {
                             $missing_args[] = $arg->getName();
                             $missing_args[] = $arg->getName();
                         }
                         }
                     }
                     }
 
 
+                    $anonymousArgs = array();
                     foreach ($request as $key => $value) {
                     foreach ($request as $key => $value) {
                         if (substr($key, 0, 3) == 'arg') {
                         if (substr($key, 0, 3) == 'arg') {
                             $key = str_replace('arg', '', $key);
                             $key = str_replace('arg', '', $key);
-                            $calling_args[$key] = $value;
+                            $anonymousArgs[$key] = $value;
                             if (($index = array_search($key, $missing_args)) !== false) {
                             if (($index = array_search($key, $missing_args)) !== false) {
                                 unset($missing_args[$index]);
                                 unset($missing_args[$index]);
                             }
                             }
                         }
                         }
                     }
                     }
 
 
+                    // re-key the $anonymousArgs to be zero-based, and add in
+                    // any values already set in calling_args (optional defaults)
+                    ksort($anonymousArgs);
+                    $calling_args = array_values($anonymousArgs) + $calling_args;
+
                     // Sort arguments by key -- @see ZF-2279
                     // Sort arguments by key -- @see ZF-2279
                     ksort($calling_args);
                     ksort($calling_args);
 
 

+ 30 - 2
tests/Zend/Rest/ServerTest.php

@@ -541,7 +541,7 @@ class Zend_Rest_ServerTest extends PHPUnit_Framework_TestCase
      * @see ZF-1949
      * @see ZF-1949
      * @group ZF-1949
      * @group ZF-1949
      */
      */
-    public function testMissingArgumentsWithDefaultsShouldNotResultInFaultResponse()
+    public function testMissingAnonymousArgumentsWithDefaultsShouldNotResultInFaultResponse()
     {
     {
         $server = new Zend_Rest_Server();
         $server = new Zend_Rest_Server();
         $server->setClass('Zend_Rest_Server_Test');
         $server->setClass('Zend_Rest_Server_Test');
@@ -549,7 +549,7 @@ class Zend_Rest_ServerTest extends PHPUnit_Framework_TestCase
         $server->handle(array('method' => 'testFunc7', 'arg1' => "Davey"));
         $server->handle(array('method' => 'testFunc7', 'arg1' => "Davey"));
         $result = ob_get_clean();
         $result = ob_get_clean();
         $this->assertContains('<status>success</status>', $result, var_export($result, 1));
         $this->assertContains('<status>success</status>', $result, var_export($result, 1));
-        $this->assertContains('<response>Hello today, How are you Davey</response>', $result, var_export($result, 1));
+        $this->assertContains('<response>Hello Davey, How are you today</response>', $result, var_export($result, 1));
     }
     }
 
 
     /**
     /**
@@ -577,6 +577,34 @@ class Zend_Rest_ServerTest extends PHPUnit_Framework_TestCase
         $this->assertContains('<status>failed</status>', $response);
         $this->assertContains('<status>failed</status>', $response);
         $this->assertNotContains('<message>An unknown error occured. Please try again.</message>', $response);
         $this->assertNotContains('<message>An unknown error occured. Please try again.</message>', $response);
     }
     }
+
+    /**
+     * @group GH-187
+     */
+    public function testMissingZeroBasedAnonymousArgumentsWithDefaultsShouldNotResultInFaultResponse()
+    {
+        $server = new Zend_Rest_Server();
+        $server->setClass('Zend_Rest_Server_Test');
+        ob_start();
+        $server->handle(array('method' => 'testFunc7', 'arg0' => "Davey"));
+        $result = ob_get_clean();
+        $this->assertContains('<status>success</status>', $result, var_export($result, 1));
+        $this->assertContains('<response>Hello Davey, How are you today</response>', $result, var_export($result, 1));
+    }
+
+    /**
+     * @group GH-187
+     */
+    public function testMissingNamesArgumentsWithDefaultsShouldNotResultInFaultResponse()
+    {
+        $server = new Zend_Rest_Server();
+        $server->setClass('Zend_Rest_Server_Test');
+        ob_start();
+        $server->handle(array('method' => 'testFunc7', 'who' => "Davey"));
+        $result = ob_get_clean();
+        $this->assertContains('<status>success</status>', $result, var_export($result, 1));
+        $this->assertContains('<response>Hello Davey, How are you today</response>', $result, var_export($result, 1));
+    }
 }
 }
 
 
 /* Test Functions */
 /* Test Functions */