- blogs:
- cles::blog

XML-RPCを使ってTracのチケットに添付ファイルを投げ込む(Ruby編)



以前に間に合わせで書いたTracにXML-RPCを投げるスクリプトがPerlだったのでRubyに書き換えようと思って作業を始めてみたら思ったより手間がかかってしまいました。
ブラウザはどちらも同じように認証用のダイアログを出してくるので分かりにくいのですが、TracLightningを使ってTracをインストールすると、認証はBasic認証ではなくてDigest認証になっています。このDigest認証をXML-RPC時にやるというのがかなりの曲者です。初めこれをすっかり忘れていて、XMLRPC::Clientを使って実装した後に認証が通らなくて色々調べる羽目になりました。
/usr/lib/ruby/1.8/xmlrpc/client.rb
If ((|user|)) and ((|password|)) are given, each time a request is send, a Authorization header is send. Currently only Basic Authentification is implemented no Digest.
上記の通り、rubyのXML-RPCライブラリであるXMLRPC::ClientはDigest認証に対応していません。
というか、僕の調べた限りではnet/httpなどのRubyの標準添付のライブラリでDigest認証に対応しているものはないようです。
† MechanizeはDigest認証できるようだ
とりあえず自分でDigest認証のルーチンを書きたくはないので、何か良いものがないかと思って検索して見ると下記のエントリを見つけました。
RubyのMechanizeでBASIC認証・Digest認証
とりあえずMechanizeがDigest認証できることは分かりましたが、MechanizeはPostのペイロードを任意の形式にするためのAPIがないので、「WWW::MechanizeでPOSTするデータを直接書くための野良拡張 - にたまごほうれん草」を参考にMechanizeにメソッドを追加してしまうことにしました。あと、XMLRPC::Clientで書いてしまった部分をそのまま使いたかったので、XMLRPC::ClientからリクエストのXMLを取り出すためのメソッドをXMLRPC::Clientに追加することにしました。
† 完成したコード
以前Perlで実装したtracAttachmentPost.plと同様の機能をRubyで書いてみたのが下記のスクリプト。
メソッドをアドホックに追加しているので、ちょっと汚いですが、とりあえず問題なく動作はします。
tracAttachmentPost.rb
† さらにDigest認証のバグにハマった
Mechanizeを使っているので、Digest認証がすんなり通るのかとおもいきや、それでもサーバから401が帰ってくるのでちょっと参りました。仕方がないので、Mechanizeが送信しているヘッダを眺めてみると、WWW-Authenticateヘッダのrealmとncの間にカンマが入っていないというバグでした。問題の部分については下記のようにちょっと書き換えています。
/usr/lib64/ruby/gems/1.8/gems/mechanize-0.9.0/lib/www/mechanize/chain
ちなみにこのバグは、僕の使っているMechanizeが0.9.0だったのが原因のようです。
0.9.1のリリースノートには下記のような記述があるので、gemで最新板をインストールしていれば特に書き換えを行う必要はありません。
RubyのWWW::Mechanize 0.9.1 が出ました - きたももんががきたん。
Nonce count fixed for digest auth requests. Thanks Adrian Slapa!
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/3330
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(112537)
3 . 年次の人間ドックへ(112001)
4 . 2023 年分の確定申告完了!(1つめ)(111574)
5 . 三菱鉛筆がラミーを買収(111452)