PEAR」タグアーカイブ

PEAR/XML_RPC2がプロキシ設定を無視しているバグを踏み抜いた

卒業研究で製作して今調整中のライブラリがあるのですが、そのサンプルのために利用しているPEARのXML_RPC2でプロキシが利用できないバグを踏んでしまいました。
GithubのリポジトリPull Requestを送ってあるのでマージ待ちですが、このバグの概要と修正箇所を記録しておきます。

概要

XML-RPCのWebサービスをPHPで利用する方法の1つとして、PEARのXML_RPC2パッケージの利用があります。詳しい使い方については公式のドキュメントを参照していただくとして、HTTPプロキシ経由で利用する場合は以下のようなコードになります。

require_once 'XML/RPC2/Client.php'; 
$wsdl = 'http://example.com/xmlrpc-wsdl.xml'; 
$option = array('proxy' => 'scheme://proxyhost:port');
 
$client = XML_RPC2_Client::create($wsdl, $option);

今回のバグは、このproxyオプションを設定したとしても、内部で使われているXML_RPC2_Util_HTTPRequestオブジェクトのsendRequest()メソッドで設定値が参照されないことによりプロキシ設定が無視されてしまいます。

修正

XML/RPC2/Util/HTTPRequest.phpを次のように変更します。

Githubの方が見やすいかもしれません。こちらからどうぞ。

HTTPRequestオブジェクトのsendRequest()メソッドで、定義されていない配列変数$paramを参照しているため、コンストラクタやXML_RPC2_Client::create()で設定したプロキシ設定が完全に無視されてしまっています。
コンストラクタと全く同じ処理が走っているので、このような形で修正してみました。

まとめ

いくら検索してもプロキシが通らなくて最終的にコードを追う羽目になり発見した次第です。

PEARには自分で実装するには骨が折れるような機能を提供しているにもかかわらずメンテナンスされていないパッケージが幾つかあります。
XML-RPCという形式がそもそも一般的でないという実情による面が大きいとは思いますが、せっかくGithubにコードを移しているのですから、必要としている人が積極的にPull Requestを送ってよりよい形にしていけるといいのではないでしょうか。