2009年1月20日火曜日

(FreeBSD) PHPのXMLRPCを使うと、オブジェクトをserializeしたテキスト中の「"」が欠落するようになった

つい最近、急に発生するようになった症状なのですが、



  • PHPのXMLRPCを使っているときに、


  • XMLRPCでオブジェクトを送ったとき、


  • serializeしたテキスト中の「"」が欠落するようになり、


  • unserializeできなくなってしまった


ということで、困ってしまいました。使っているソフトウェアはすべてFreeBSDのportsでインストールしたものです。



  • lang/php5


  • net/pear-XML_RPC


$clnt = new XML_RPC_client();
$clnt->setDebug( TRUE );



みたいにして、デバッグメッセージを眺めてみると・・・



<pre>---GOT---
HTTP/1.1 200 OK
Date: Mon, 19 Jan 2009 00:56:47 GMT
Server: Apache/2.2.11 (FreeBSD) mod_ssl/2.2.11 OpenSSL/0.9.8i DAV/2 PHP/5.2.8 with Suhosin-Patch SVN/1.5.5
X-Powered-By: PHP/5.2.8
Content-Length: 1257
Connection: close
Content-Type: text/xml; charset=UTF-8

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
<params>
<param>
<value><string>O:12:&quot;XXXXXXXXXXXX&quot;:17:{s:2:&quot;id&quot;;s:2:&quot;34&quot;;
(途中省略)
</param>
</params>
</methodResponse>
---END---</pre>

<pre>---PARSED---
object(XML_RPC_Value)#6 (2) {
  ["me"]=>
  array(1) {
    ["string"]=>
    string(695) "O:12:XXXXXXXXXXXX:17:{s:2:id;s:2:34;
  }
  ["mytype"]=>
  int(1)
}
---END---</pre>



これを見てると

O:12:&quot;XXXXXXXXXXXX&quot;:17:{s:2:&quot;id&quot;;s:2:&quot;34&quot;;~略~

というのを受け取って、デコードしたら、

O:12:XXXXXXXXXXXX:17:{s:2:id;s:2:34;~略~

になって、「"」が消えてなくなっています。本当は、

O:12:"XXXXXXXXXXXX":17:{s:2:"id";s:2:"34";~略~

となってくれるんじゃないかと思うのです。XMLRPCの仕様を見ても、stringに「"」を入れてはいけない、とは書いてなかったような気がしますが、ちゃんと調べてません。以前は、これで動いていたので・・・





最近、perl-5.8.9にアップデートする、という大きな変化があったのでそれかな、と思ったんですが、perlは関係なさそうだし。
で、いろいろ探していったら見つかりました。



libxml2が犯人でした。

libxml2-2.6.32_2

libxml2-2.7.2_1

になったら、この「"」が欠落するようになりました。



なんとなく
/usr/local/share/pear/XML/RPC.php
の中の、このあたり



        /*
         * be tolerant of junk after methodResponse
         * (e.g. javascript automatically inserted by free hosts)
         * thanks to Luca Mariano <luca.mariano@email.it>
         */
        $data = substr($data, 0, strpos($data, "</methodResponse>") + 17);
        $this->response_payload = $data;



        if (!xml_parse($parser_resource, $data, sizeof($data))) {



ここのxml_parse()の挙動が変化したんじゃないかと思うのですが、確認はしてません。



とりあえず、自分で明示的にserialize()して、さらにbase64_encode()するようにしちゃいました。



0 件のコメント:

コメントを投稿