MessagePack-RPC の PHP 版のパッチ

MessagePack-RPC の PHP をクライアントにした時にこんなエラーが出る。

<?php
require_once '../lib/Client.php';
$client = new MessagePackRPC_Client('localhost', '19850');
$ret = $client->call('echo', array('PHP PHP'));
var_dump($ret);
PHP Fatal error:  Uncaught exception 'Exception' with message 'hello PHP PHP' in /path/to/msgpack-rpc/php/lib/Client.php:30
Stack trace:
#0 /path/to/msgpack-rpc/php/lib/Client.php(38): MessagePackRPC_Client->send('echo', Array)
#1 /path/to/msgpack-rpc/php/test/sample.php(4): MessagePackRPC_Client->call('echo', Array)
#2 {main}
  thrown in /path/to/msgpack-rpc/php/lib/Client.php on line 30

期待している値を渡して例外を発生している。
ソースを見ると配列の順番が仕様と逆になっている。

The response message is a four elements array shown below, packed by MessagePack format.
[type, msgid, error, result]

http://wiki.msgpack.org/display/MSGPACK/RPC+specification#RPCspecification-ResponseMessage

実際のソース。
msgpack-rpc/php/lib/Back.php

<?php
-snip-
  public function clientRecvObject($recv)
  {
    $data = $this->msgpackDecode($recv);

    $type = $data[0];
    $code = $data[1];
    $sets = $data[2];
    $errs = $data[3];

    if ($type != 1) {
      throw new Exception($this->errorMessage02);
    }

    $feature = new MessagePackRPC_Future();
    $feature->setErrors($errs);
    $feature->setResult($sets);

    return $feature;
  }
-snip-

というわけでこういうパッチを当てると動く。

diff --git a/php/lib/Back.php b/php/lib/Back.php
index 679b63d..12b9bec 100644
--- a/php/lib/Back.php
+++ b/php/lib/Back.php
@@ -44,8 +44,8 @@ class MessagePackRPC_Back
 
     $type = $data[0];
     $code = $data[1];
-    $sets = $data[2];
-    $errs = $data[3];
+    $errs = $data[2];
+    $sets = $data[3];
 
     if ($type != 1) {
       throw new Exception($this->errorMessage02);
@@ -63,8 +63,8 @@ class MessagePackRPC_Back
     $data    = array();
     $data[0] = 1;
     $data[1] = $code;
-    $data[2] = $sets;
-    $data[3] = $errs;
+    $data[2] = $errs;
+    $data[3] = $sets;
 
     $send = $this->msgpackEncode($data);
 
@@ -100,4 +100,4 @@ class MessagePackRPC_Back
   {
     return   msgpack_pack($data);
   }
-}
\ No newline at end of file
+}

ちなみにテストコードの server.php を動作させると

PHP Parse error:  syntax error, unexpected T_UNSET in /path/to/msgpack-rpc/php/lib/Server.php on line 42

とか言われて全く動作しなかった。