[Ruby][Rails] HTTPレスポンスのヘッダ折りたたみ。
こんにちわ。ばたっちです。
net/http使ってHTTPのレスポンスの処理をしていたら、ヘッダのパースでエラーになってるっぽい。
Net::HTTPBadResponse: wrong header line format /usr/lib/ruby/1.8/net/http.rb:2034:in `each_response_header' /usr/lib/ruby/1.8/net/http.rb:2008:in `read_new'
net/http.rbがHTTPヘッダの折りたたみ表記に対応してないみたいね。
Content-Type: text/html; charset=UTF-8
こういうの。確かRFC的には問題なかったと思うのだけど。(間違ってたらすみません)
というわけで以下のように修正。
/usr/lib/ruby/1.8/net/http.rbを直接置き換えてるんだけど、Railsプロジェクト内で上書きさせる方法ってないのかなぁ。(lib/以下に置いてみたけどダメでした)
--- http.rb.orig 2006-07-26 22:27:18.000000000 +0900 +++ http.rb 2007-11-22 12:58:28.000000000 +0900 @@ -2027,12 +2027,20 @@ end def each_response_header(sock) + pm = ["", ""] while true line = sock.readuntil("\n", true).sub(/\s+\z/, '') break if line.empty? - m = /\A([^:]+):\s*/.match(line) or - raise HTTPBadResponse, 'wrong header line format' - yield m[1], m.post_match + m = /\A([^:]+):\s*/.match(line) + if m.nil? + pm[1] += line + next + end + yield pm[0], pm[1] + pm = [m[1], m.post_match] end end end
いちおうちゃんと動いています。(無保証)
追記:environment.rbの最後でrequireしとけばいいみたい。
lib/http_fix.rb ---- module Net #:nodoc: class HTTPResponse class << HTTPResponse def each_response_header(sock) pm = ["", ""] while true line = sock.readuntil("\n", true).sub(/\s+\z/, '') break if line.empty? m = /\A([^:]+):\s*/.match(line) if m.nil? pm[1] += line next end yield pm[0], pm[1] pm = [m[1], m.post_match] end end end end # HTTPResponse end # module Net
ってファイル作って、config/environment.rbの最後に、以下の行を追加すると。。φ(.. )
require 'http_fix.rb