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

ruby-changes:50817

From: naruse <ko1@a...>
Date: Thu, 29 Mar 2018 01:44:40 +0900 (JST)
Subject: [ruby-changes:50817] naruse:r63025 (ruby_2_5): revert r62985 (r62966 in trunk)

naruse	2018-03-29 01:44:33 +0900 (Thu, 29 Mar 2018)

  New Revision: 63025

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=63025

  Log:
    revert r62985 (r62966 in trunk)
    
    It breaks test-all

  Modified files:
    branches/ruby_2_5/lib/webrick/httpproxy.rb
    branches/ruby_2_5/lib/webrick/httprequest.rb
    branches/ruby_2_5/test/webrick/test_httpproxy.rb
    branches/ruby_2_5/test/webrick/test_httprequest.rb
Index: ruby_2_5/test/webrick/test_httpproxy.rb
===================================================================
--- ruby_2_5/test/webrick/test_httpproxy.rb	(revision 63024)
+++ ruby_2_5/test/webrick/test_httpproxy.rb	(revision 63025)
@@ -118,100 +118,6 @@ class TestWEBrickHTTPProxy < Test::Unit: https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/webrick/test_httpproxy.rb#L118
     }
   end
 
-  def test_big_bodies
-    require 'digest/md5'
-    rand_str = File.read(__FILE__)
-    rand_str.freeze
-    nr = 1024 ** 2 / rand_str.size # bigger works, too
-    exp = Digest::MD5.new
-    nr.times { exp.update(rand_str) }
-    exp = exp.hexdigest
-    TestWEBrick.start_httpserver do |o_server, o_addr, o_port, o_log|
-      o_server.mount_proc('/') do |req, res|
-        case req.request_method
-        when 'GET'
-          res['content-type'] = 'application/octet-stream'
-          if req.path == '/length'
-            res['content-length'] = (nr * rand_str.size).to_s
-          else
-            res.chunked = true
-          end
-          res.body = ->(socket) { nr.times { socket.write(rand_str) } }
-        when 'POST'
-          dig = Digest::MD5.new
-          req.body { |buf| dig.update(buf); buf.clear }
-          res['content-type'] = 'text/plain'
-          res['content-length'] = '32'
-          res.body = dig.hexdigest
-        end
-      end
-        http = Net::HTTP.new(o_addr, o_port)
-        IO.pipe do |rd, wr|
-          headers = {
-            'Content-Type' => 'application/octet-stream',
-            'Transfer-Encoding' => 'chunked',
-          }
-          post = Net::HTTP::Post.new('/', headers)
-          th = Thread.new { nr.times { wr.write(rand_str) }; wr.close }
-          post.body_stream = rd
-          http.request(post) do |res|
-            assert_equal 'text/plain', res['content-type']
-            assert_equal 32, res.content_length
-            assert_equal exp, res.body
-          end
-          assert_nil th.value
-        end
-
-      TestWEBrick.start_httpproxy do |p_server, p_addr, p_port, p_log|
-        http = Net::HTTP.new(o_addr, o_port, p_addr, p_port)
-        http.request_get('/length') do |res|
-          assert_equal(nr * rand_str.size, res.content_length)
-          dig = Digest::MD5.new
-          res.read_body { |buf| dig.update(buf); buf.clear }
-          assert_equal exp, dig.hexdigest
-        end
-        http.request_get('/') do |res|
-          assert_predicate res, :chunked?
-          dig = Digest::MD5.new
-          res.read_body { |buf| dig.update(buf); buf.clear }
-          assert_equal exp, dig.hexdigest
-        end
-
-        IO.pipe do |rd, wr|
-          headers = {
-            'Content-Type' => 'application/octet-stream',
-            'Content-Length' => (nr * rand_str.size).to_s,
-          }
-          post = Net::HTTP::Post.new('/', headers)
-          th = Thread.new { nr.times { wr.write(rand_str) }; wr.close }
-          post.body_stream = rd
-          http.request(post) do |res|
-            assert_equal 'text/plain', res['content-type']
-            assert_equal 32, res.content_length
-            assert_equal exp, res.body
-          end
-          assert_nil th.value
-        end
-
-        IO.pipe do |rd, wr|
-          headers = {
-            'Content-Type' => 'application/octet-stream',
-            'Transfer-Encoding' => 'chunked',
-          }
-          post = Net::HTTP::Post.new('/', headers)
-          th = Thread.new { nr.times { wr.write(rand_str) }; wr.close }
-          post.body_stream = rd
-          http.request(post) do |res|
-            assert_equal 'text/plain', res['content-type']
-            assert_equal 32, res.content_length
-            assert_equal exp, res.body
-          end
-          assert_nil th.value
-        end
-      end
-    end
-  end
-
   def make_certificate(key, cn)
     subject = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=#{cn}")
     exts = [
Index: ruby_2_5/test/webrick/test_httprequest.rb
===================================================================
--- ruby_2_5/test/webrick/test_httprequest.rb	(revision 63024)
+++ ruby_2_5/test/webrick/test_httprequest.rb	(revision 63025)
@@ -237,7 +237,6 @@ GET / https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/webrick/test_httprequest.rb#L237
 
   def test_chunked
     crlf = "\x0d\x0a"
-    expect = File.read(__FILE__).freeze
     msg = <<-_end_of_message_
       POST /path HTTP/1.1
       Host: test.ruby-lang.org:8080
@@ -254,14 +253,7 @@ GET / https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/webrick/test_httprequest.rb#L253
     msg << "0" << crlf
     req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
     req.parse(StringIO.new(msg))
-    assert_equal(expect, req.body)
-
-    # chunked req.body_reader
-    req = WEBrick::HTTPRequest.new(WEBrick::Config::HTTP)
-    req.parse(StringIO.new(msg))
-    dst = StringIO.new
-    IO.copy_stream(req.body_reader, dst)
-    assert_equal(expect, dst.string)
+    assert_equal(File.read(__FILE__), req.body)
   end
 
   def test_forwarded
Index: ruby_2_5/lib/webrick/httpproxy.rb
===================================================================
--- ruby_2_5/lib/webrick/httpproxy.rb	(revision 63024)
+++ ruby_2_5/lib/webrick/httpproxy.rb	(revision 63025)
@@ -211,15 +211,21 @@ module WEBrick https://github.com/ruby/ruby/blob/trunk/ruby_2_5/lib/webrick/httpproxy.rb#L211
     end
 
     def do_GET(req, res)
-      perform_proxy_request(req, res, Net::HTTP::Get)
+      perform_proxy_request(req, res) do |http, path, header|
+        http.get(path, header)
+      end
     end
 
     def do_HEAD(req, res)
-      perform_proxy_request(req, res, Net::HTTP::Head)
+      perform_proxy_request(req, res) do |http, path, header|
+        http.head(path, header)
+      end
     end
 
     def do_POST(req, res)
-      perform_proxy_request(req, res, Net::HTTP::Post, req.body_reader)
+      perform_proxy_request(req, res) do |http, path, header|
+        http.post(path, req.body || "", header)
+      end
     end
 
     def do_OPTIONS(req, res)
@@ -295,56 +301,38 @@ module WEBrick https://github.com/ruby/ruby/blob/trunk/ruby_2_5/lib/webrick/httpproxy.rb#L301
       return FakeProxyURI
     end
 
-    def perform_proxy_request(req, res, req_class, body_stream = nil)
+    def perform_proxy_request(req, res)
       uri = req.request_uri
       path = uri.path.dup
       path << "?" << uri.query if uri.query
       header = setup_proxy_header(req, res)
       upstream = setup_upstream_proxy_authentication(req, res, header)
+      response = nil
 
-      body_tmp = []
       http = Net::HTTP.new(uri.host, uri.port, upstream.host, upstream.port)
-      req_fib = Fiber.new do
-        http.start do
-          if @config[:ProxyTimeout]
-            ##################################   these issues are
-            http.open_timeout = 30   # secs  #   necessary (maybe because
-            http.read_timeout = 60   # secs  #   Ruby's bug, but why?)
-            ##################################
-          end
-          if body_stream && req['transfer-encoding'] =~ /\bchunked\b/i
-            header['Transfer-Encoding'] = 'chunked'
-          end
-          http_req = req_class.new(path, header)
-          http_req.body_stream = body_stream if body_stream
-          http.request(http_req) do |response|
-            # Persistent connection requirements are mysterious for me.
-            # So I will close the connection in every response.
-            res['proxy-connection'] = "close"
-            res['connection'] = "close"
-
-            # stream Net::HTTP::HTTPResponse to WEBrick::HTTPResponse
-            res.status = response.code.to_i
-            res.chunked = response.chunked?
-            choose_header(response, res)
-            set_cookie(response, res)
-            set_via(res)
-            response.read_body do |buf|
-              body_tmp << buf
-              Fiber.yield # wait for res.body Proc#call
-            end
-          end # http.request
-        end
-      end
-      req_fib.resume # read HTTP response headers and first chunk of the body
-      res.body = ->(socket) do
-        while buf = body_tmp.shift
-          socket.write(buf)
-          buf.clear
-          req_fib.resume # continue response.read_body
+      http.start do
+        if @config[:ProxyTimeout]
+          ##################################   these issues are
+          http.open_timeout = 30   # secs  #   necessary (maybe because
+          http.read_timeout = 60   # secs  #   Ruby's bug, but why?)
+          ##################################
         end
+        response = yield(http, path, header)
       end
+
+      # Persistent connection requirements are mysterious for me.
+      # So I will close the connection in every response.
+      res['proxy-connection'] = "close"
+      res['connection'] = "close"
+
+      # Convert Net::HTTP::HTTPResponse to WEBrick::HTTPResponse
+      res.status = response.code.to_i
+      choose_header(response, res)
+      set_cookie(response, res)
+      set_via(res)
+      res.body = response.body
     end
+
     # :stopdoc:
   end
 end
Index: ruby_2_5/lib/webrick/httprequest.rb
===================================================================
--- ruby_2_5/lib/webrick/httprequest.rb	(revision 63024)
+++ ruby_2_5/lib/webrick/httprequest.rb	(revision 63025)
@@ -258,31 +258,6 @@ module WEBrick https://github.com/ruby/ruby/blob/trunk/ruby_2_5/lib/webrick/httprequest.rb#L258
     end
 
     ##
-    # Prepares the HTTPRequest object for use as the
-    # source for IO.copy_stream
-
-    def body_reader
-      @body_tmp = []
-      @body_rd = Fiber.new do
-        body do |buf|
-          @body_tmp << buf
-          Fiber.yield
-        end
-      end
-      @body_rd.resume # grab the first chunk and yield
-      self
-    end
-
-    # for IO.copy_stream
-    def readpartial(size, buf = ''.b) # :nodoc
-      res = @body_tmp.shift or raise EOFError, 'end of file reached'
-      buf.replace(res)
-      res.clear
-      @body_rd.resume # get more chunks
-      buf
-    end
-
-    ##
     # Request query as a Hash
 
     def query

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

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