ttt

getttyent

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

2009-01-19 21:42:06 | デジタル・インターネット

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

  • 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()するようにしちゃいました。


コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。