2024/02/23(金)Ruby XMLRPCでdokuwikiのAPIをコールするとエラー

2024/02/23 18:52
最近機会があってdokuwikiを触っている。
DBを使わないので遅いが、その分設置場所の選択肢が多い。
PHPが使えるフリーサーバーがいくつかあるので、小さいチーム作業や情報公開用途であれば扱いやすいと思う。

さて、dokuwikiは標準でXML-RPCによるAPIを備えているのだが、Rubyからコールしようとしてハマった。

このサンプル通り、
xmlrpc:clients:devel:xmlrpc:clients [DokuWiki]
require 'xmlrpc/client'

server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084)
result = server.call("dokuwiki.getVersion")
pp result
としてコールしても、
XML-RPC server accepts XML requests only.
が返ってきてしまう。

環境は、
・dokuwiki: Release 2024-02-06a "Kaos"
・PHP: 7.4
・Ruby: 2.7
HTTPサーバは問わない。

調査。

・RubyのXMLRPCはリクエストのContent-Typeに"text/xml;charset=UTF-8"がセットされる。
・dokuwikiのXML-RPC APIは"application/xml"か"text/xml"だけを受け付ける。これはcharsetがあるのもダメっぽい?

うーん、リクエストにcharsetはあっても良いはずなので、dokuwiki側のコードがかなり変か何かを読み飛ばしてるかもしれない。

とりあえず、RubyのXMLRPCはhttp_header_extraをセットすることでヘッダーを上書きできる。
コレを使って、以下にすれば動く。
require 'xmlrpc/client'

server = XMLRPC::Client.new("localhost", "/dokuwiki/lib/exe/xmlrpc.php", 8084)
server.http_header_extra = {"Content-Type" => "text/xml"}
result = server.call("dokuwiki.getVersion")
pp result
OK キャンセル 確認 その他