the glue

やってみたことで忘れそうなこと、役立ちそうなことなどをまとめています。たまに何気ない日常の話もします。

Ruby 2.xでXMLRPCが使えない

はてなキーワード連想語検索APIをRuby2.1で使おうとしたらハマったのでメモ。

元のコード

はてなキーワード連想語API - Hatena Developer Center

#!/usr/bin/env ruby

$KCODE = "u"
require "xmlrpc/client"

server = XMLRPC::Client.new("d.hatena.ne.jp", "/xmlrpc")
result = server.call("hatena.getSimilarWord", {
  "wordlist" => %w[ Hatena Ruby ]
})

puts result['wordlist'].map {|v| v['word'] }.join(', ')

Hatena Ruby くらいの単語だと大丈夫なんだけど、ちょっと長い単語とか日本語とか投げ込むと以下のようなエラー

/usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:511:in `do_rpc': Wrong size. Was 487, should be 223 (RuntimeError)
    from /usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:286:in `call2'
    from /usr/local/Cellar/ruby/2.1.2_2/lib/ruby/2.1.0/xmlrpc/client.rb:267:in `call'
    from hatena.rb:7:in `<main>'

原因

しらべてみるとこれが引っかかった。
Bug #8182: XMLRPC request fails with "Wrong size. Was 31564, should be 1501" - ruby-trunk - Ruby Issue Tracking System

  • Ruby 2.0以降のNet::HTTPはHTTP圧縮がデフォルト
  • XMLRPCはNet::HTTPを使ってるがHTTP圧縮を想定していないバイト数チェックをしてるらしい

解決策

とりあえずHTTP圧縮を無効にしてみる

require "xmlrpc/client"
server = XMLRPC::Client.new("d.hatena.ne.jp", "/xmlrpc")
# この一行を追加
server.http_header_extra = {'accept-encoding' => 'identity'}

この後は最初のと一緒

とりあえず解決できたけど結局HTTP圧縮使えてない...