ZF-9374: Zend_Rest_Server does not properly handle optional parameters when anonymous (arg1, etc) parameters are passed in

Description

When anonymous parameters are passed in, and one or more optional parameters are missing, the default values are not correctly filled in, and the call fails with a 'missing arguments' error message.

Comments

There was already a unit test for this functionality, but the expected value was incorrectly hard-coded backwards, so the failure was counting as a pass.

Attached patch fixes Zend_Rest_Server, and accompanying unit tests.

'sorry.. original diff had a misleading/incorrect comment. This is the correct diff.

I agree with Jonathan Csanyi.

I ran into that problem an thought {{Zend_Rest_Client}} was the cause as it uses the "arg1" query parameter name when only one argument is passed to the server (see ZF-4910). But is seems that {{Zend_Rest_Server}} is guilty.

With the following server PHP code:


class MyServerImpl
{
  public function myMethod ($var)
  {
    $return $var*$var;
  }
  public function myOtherMethod ($var = 3)
  {
    $return $var*$var;
  }
}
$server = new Zend_Rest_Server();
$server->setClass('MyServerImpl');
$server->handle();

The following client PHP code:


$client
  ->myMethod(5)
  ->get();

Issues the following request: {{server.php?method=myMethod&myMethod=5&arg1=5}}

Which is handled by {{Zend_Rest_Server::handle()}} as


$missing_args[0] = 'var';
$calling_args[1] = 5
=> myMethod(5);

{color:green}Which is correct.{color}

And the other following client PHP code:


$client
  ->myOtherMethod(5)
  ->get();

Issues the following request: {{server.php?method=myOtherMethod&myOtherMethod=5&arg1=5}}

Which is handled by {{Zend_Rest_Server::handle()}} as


$missing_args[] = array();
$calling_args[0] = 3;
$calling_args[1] = 5;
=> myOtherMethod(3);

{color:red}Which is incorrect.{color}

The solution would be to either use 0-based array everywhere, or the given "library/Zend/Rest/Server.php" DIFF file [^trunk-correct.diff].