summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-28 16:46:25 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-03-28 16:46:25 +0000
commit85883dc393f60adc3043d28899eff3f1ce53b4a5 (patch)
treecd93bb5643305ef3ea7329a662cc40fa9bc282d1
parentd9a3c2e5920607b401e167265c1f28210f6921df (diff)
parent56765c559e73a9f9db5bb51a1ab9a994f33597ef (diff)
add tag v2_5_1v2_5_1
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v2_5_1@63029 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/webrick/httpproxy.rb74
-rw-r--r--lib/webrick/httprequest.rb25
-rw-r--r--test/webrick/test_httpproxy.rb94
-rw-r--r--test/webrick/test_httprequest.rb10
-rw-r--r--version.h6
5 files changed, 35 insertions, 174 deletions
diff --git a/lib/webrick/httpproxy.rb b/lib/webrick/httpproxy.rb
index d180ff4831..be5531fec0 100644
--- a/lib/webrick/httpproxy.rb
+++ b/lib/webrick/httpproxy.rb
@@ -211,15 +211,21 @@ module WEBrick
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
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
diff --git a/lib/webrick/httprequest.rb b/lib/webrick/httprequest.rb
index 69345e44a5..b40bcb0d57 100644
--- a/lib/webrick/httprequest.rb
+++ b/lib/webrick/httprequest.rb
@@ -258,31 +258,6 @@ module WEBrick
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
diff --git a/test/webrick/test_httpproxy.rb b/test/webrick/test_httpproxy.rb
index 52ecc91b28..452e7b94b7 100644
--- a/test/webrick/test_httpproxy.rb
+++ b/test/webrick/test_httpproxy.rb
@@ -118,100 +118,6 @@ class TestWEBrickHTTPProxy < Test::Unit::TestCase
}
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 = [
diff --git a/test/webrick/test_httprequest.rb b/test/webrick/test_httprequest.rb
index 6b99e34569..855ff9d4a7 100644
--- a/test/webrick/test_httprequest.rb
+++ b/test/webrick/test_httprequest.rb
@@ -237,7 +237,6 @@ GET /
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 /
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
diff --git a/version.h b/version.h
index 3d5bbf0683..e474bbc85e 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.5.1"
-#define RUBY_RELEASE_DATE "2018-03-28"
-#define RUBY_PATCHLEVEL 56
+#define RUBY_RELEASE_DATE "2018-03-29"
+#define RUBY_PATCHLEVEL 57
#define RUBY_RELEASE_YEAR 2018
#define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 28
+#define RUBY_RELEASE_DAY 29
#include "ruby/version.h"