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

ruby-changes:13782

From: nahi <ko1@a...>
Date: Fri, 30 Oct 2009 22:17:49 +0900 (JST)
Subject: [ruby-changes:13782] Ruby:r25579 (trunk): * lib/net/http.rb (Net::HTTPResponse#each_response_header):

nahi	2009-10-30 22:09:03 +0900 (Fri, 30 Oct 2009)

  New Revision: 25579

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

  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:
    trunk/test/net/http/test_httpresponse.rb
  Modified files:
    trunk/ChangeLog
    trunk/lib/net/http.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 25578)
+++ ChangeLog	(revision 25579)
@@ -1,3 +1,11 @@
+Fri Oct 30 22:09:47 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.
+
 Fri Oct 30 18:54:04 2009  Yukihiro Matsumoto  <matz@r...>
 
 	* string.c (trnext): detect empty range and raise exception.
Index: lib/net/http.rb
===================================================================
--- lib/net/http.rb	(revision 25578)
+++ lib/net/http.rb	(revision 25579)
@@ -2158,13 +2158,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: test/net/http/test_httpresponse.rb
===================================================================
--- test/net/http/test_httpresponse.rb	(revision 0)
+++ test/net/http/test_httpresponse.rb	(revision 25579)
@@ -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/

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