メモ
url
がUTF-8的に不正なバイト列を含む文字列を返してくる場合,普通に HTTP::Client::Response から body
を取り出そうとするとエラーになる。
data = HTTP::Client.get(url).body # => invalid encoding: "utf-8" (ArgumentError)
こんなとき get
なり post
なりをブロック付きで呼ぶと,ブロック引数で渡される HTTP::Client::Response オブジェクトに対して IO 型の #body_io
が使えるようになるので,IO#set_encoding
で不正なバイト列を明示的にスキップさせるようにすれば,とりあえずエラーは回避可能。
data = HTTP::Client.get(url) do |res|
res.body_io.set_encoding("utf-8", :skip)
res.body_io.get_to_end
end