HOME  >  スポンサー広告 >  Ruby >  Ruby 2.0 で XMLRPC を使うと発生するエラー(Wrong size)とその解決法

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--/--/-- | カテゴリ:スポンサー広告 | トラックバック(-) | コメント(-)

Ruby 2.0 で XMLRPC を使うと発生するエラー(Wrong size)とその解決法

# 今回は Net::HTTP に関連する gem であれば他にも応用効くかもしれません。

Ruby からブログ投稿しようと思いたち、XMLRPC 使ってみればエラー発生。
過去に、Ruby 1.9.3 で動作していたものを基にしたので、エラーはおかしいということで調査開始。
C:/ruby/lib/ruby/2.0.0/xmlrpc/client.rb:506:in `do_rpc': Wrong size. Was 1802, should be 324 (RuntimeError)
        from C:/ruby/lib/ruby/2.0.0/xmlrpc/client.rb:281:in `call2'
        from C:/ruby/lib/ruby/2.0.0/xmlrpc/client.rb:262:in `call'
        from check.rb:13:in `
'
さっくり原因~解決法をまとめると、
Ruby 2.0 の XMLRPC (が使ってるNet::HTTP) では、HTTP 圧縮するのがデフォルト動作になったのに、
XMLRPC 内でレスポンスのバイトサイズをチェックする際、
無圧縮のものだと想定してバイトサイズを比較しちゃってるからエラーが発生しています。

なので、解決策は 2 通り。
  1. 最初から無圧縮でやりとりしようねってサーバとお約束する
  2. 無圧縮だと想定しちゃってるバイトサイズのチェックをどうにかする

そんなわけで、エラーが起きる条件をまとめます。
  • Ruby 2.0 以降
  • XMLRPC 使用
  • やりとりするサーバが HTTP 圧縮に対応している

原因

↓のリンク先に詳しく記載されています。(英語)
Bug #8182 - XMLRPC request fails with "Wrong size. Was 31564, should be 1501"

上でも書きましたが、ざっくりと原因のまとめ。
  1. XMLRPC は、Net::HTTP を使用している
  2. Ruby 2.0 から、Net::HTTP はデフォルトで HTTP 圧縮するように変わった
  3. XMLRPC 内に、正しく受信できたか確認するため、受信バイトサイズをチェックする処理がある
  4. 3. の処理は HTTP 圧縮のことを考慮していない
  5. HTTP 圧縮の考慮が無いため、受信バイトサイズの異常とみなされてエラー発生

お手軽解決法

HTTP 圧縮されると駄目!という状況なので、
サーバに圧縮せずそのまま送ってねーとお願いするだけです。
つまり、ヘッダの accept-encoding に identity を設定してあげれば解決です。
require 'xmlrpc/client'

server = XMLRPC::Client.new( "blog.fc2.com", "/xmlrpc.php", 80)
server.http_header_extra = {'accept-encoding' => 'identity'}  # ←これ

お手軽だけど、HTTP 圧縮されないのでその辺りのパフォーマンスを気にする方は次の解決法を。

どうしても HTTP 圧縮したい人向けの解決法

エラーチェックを削除しちゃいます。
編集するファイル: { ruby インストール先 }\lib\ruby\2.0.0\xmlrpc\client.rb
expected = resp["Content-Length"] || ""
if data.nil? or data.bytesize == 0
  raise "Wrong size. Was #{data.bytesize}, should be #{expected}"
elsif expected != "" and expected.to_i != data.bytesize and resp["Transfer-Encoding"].nil?
  raise "Wrong size. Was #{data.bytesize}, should be #{expected}"
end
※この削除の是非ですが、上で貼りつけたリンク先で議論されていて、
そもそも Net::HTTP でチェックしてんだから、ここでチェックする必要なくね?
消していいんじゃね?という結論になってます。
が、公式には、まだとりこまれてないようです。
GitHub 上の ruby 2.1.0 のソース見ても、まだ直ってないですし。……むむむ。
なので、自己責任で対応してください。

# レスポンスの Content-Encoding 見るようにして入力チェックを改造して残せば、
# まぁ安心じゃね?という方もいるかと思うのですが、
# fc2 のサーバに試しに投げてみたら、
# 何故だか Content-Encoding が空っぽで返ってきたので単純にはいかず……むむむ。
# なんか間違ったかな……。
2014/01/17 | カテゴリ:Ruby | トラックバック(0) | コメント(0)
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
http://uisteven.blog.fc2.com/tb.php/44-7ed84cb6

外部リンク

カンパのお願い
公開しているソフトウェアはフリーウェアなので無料でご利用いただけます。 気に入ってくださった方は、Amazon でお買い物をする際に下記のリンクを経由して頂ければ励みになります。

検索BOX・タグ一覧
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。