つい最近、急に発生するようになった症状なのですが、
- 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:"XXXXXXXXXXXX":17:{s:2:"id";s:2:"34";
(途中省略)
</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:"XXXXXXXXXXXX":17:{s:2:"id";s:2:"34";~略~
というのを受け取って、デコードしたら、
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 件のコメント:
コメントを投稿