[前][次][番号順一覧][スレッド一覧]

ruby-changes:13780

From: nahi <ko1@a...>
Date: Fri, 30 Oct 2009 22:11:52 +0900 (JST)
Subject: [ruby-changes:13780] Ruby:r25577 (ruby_1_8): * lib/net/http.rb (Net::HTTPResponse#each_response_header):

nahi	2009-10-30 22:05:23 +0900 (Fri, 30 Oct 2009)

  New Revision: 25577

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=25577

  Log:
    * lib/net/http.rb (Net::HTTPResponse#each_response_header):
              accept multiline message header of HTTP response.  see #1796.
              cf. RFC 2616 '4.2 Message Header'.  
    
            * test/net/http/test_httpresponse.rb: added.

  Added files:
    branches/ruby_1_8/test/net/http/test_httpresponse.rb
  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/lib/net/http.rb

Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 25576)
+++ ruby_1_8/ChangeLog	(revision 25577)
@@ -1,3 +1,11 @@
+Fri Oct 30 22:02:15 2009  NAKAMURA, Hiroshi  <nahi@r...>
+
+	* lib/net/http.rb (Net::HTTPResponse#each_response_header):
+	  accept multiline message header of HTTP response.  see #1796.
+	  cf. RFC 2616 '4.2 Message Header'.
+
+	* test/net/http/test_httpresponse.rb: added.
+
 Tue Oct 27 22:05:46 2009  Nobuyoshi Nakada  <nobu@r...>
 
 	* string.c (rb_str_inspect): get rid of adding garbage to shor
Index: ruby_1_8/lib/net/http.rb
===================================================================
--- ruby_1_8/lib/net/http.rb	(revision 25576)
+++ ruby_1_8/lib/net/http.rb	(revision 25577)
@@ -2034,13 +2034,20 @@
       end
 
       def each_response_header(sock)
+        key = value = nil
         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
+          if line[0] == ?\  or line[0] == ?\t and value
+            value << ' ' unless value.empty?
+            value << line.strip
+          else
+            yield key, value if key
+            key, value = line.strip.split(/\s*:\s*/, 2)
+            raise HTTPBadResponse, 'wrong header line format' if value.nil?
+          end
         end
+        yield key, value if key
       end
     end
 
Index: ruby_1_8/test/net/http/test_httpresponse.rb
===================================================================
--- ruby_1_8/test/net/http/test_httpresponse.rb	(revision 0)
+++ ruby_1_8/test/net/http/test_httpresponse.rb	(revision 25577)
@@ -0,0 +1,40 @@
+require 'net/http'
+require 'test/unit'
+require 'stringio'
+
+class HTTPResponseTest < Test::Unit::TestCase
+  def test_singleline_header
+    io = dummy_io(<<EOS.gsub(/\n/, "\r\n"))
+HTTP/1.1 200 OK
+Content-Length: 5
+Connection: close
+
+hello
+EOS
+    res = Net::HTTPResponse.read_new(io)
+    assert_equal('5', res.header['content-length'])
+    assert_equal('close', res.header['connection'])
+  end
+
+  def test_multiline_header
+    io = dummy_io(<<EOS.gsub(/\n/, "\r\n"))
+HTTP/1.1 200 OK
+X-Foo: XXX
+   YYY
+X-Bar:
+ XXX
+\tYYY
+
+hello
+EOS
+    res = Net::HTTPResponse.read_new(io)
+    assert_equal('XXX YYY', res.header['x-foo'])
+    assert_equal('XXX YYY', res.header['x-bar'])
+  end
+
+private
+
+  def dummy_io(str)
+    Net::BufferedIO.new(StringIO.new(str))
+  end
+end

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]