[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
