« [Rails] SymbolとStringで悩む。 | メイン | [Ruby][Rails] ログ出力フォーマットを変えたい! »

[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

トラックバック

このエントリーのトラックバックURL:
http://pw.tech-arts.co.jp/cgi-bin/tamt32/mt-tb.cgi/63

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)