From e0512b29aa47d4b79a27b0c0356bf47ec9b4e072 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun Date: Wed, 11 Mar 2020 14:26:22 +0900 Subject: [PATCH] Let Net::HTTP.get take request headers (#2957) * Let Net::HTTP.get take request headers * Add more test cases for no header usages * Add examples with request headers * Add a NEWS entry [ci skip] [Feature #16686] --- NEWS.md | 6 ++++++ lib/net/http.rb | 34 ++++++++++++++++++++++++---------- test/net/http/test_http.rb | 21 +++++++++++++++++++++ test/net/http/utils.rb | 6 +++++- 4 files changed, 56 insertions(+), 11 deletions(-) diff --git a/NEWS.md b/NEWS.md index 70da707bba..26274c4e6b 100644 --- a/NEWS.md +++ b/NEWS.md @@ -98,6 +98,12 @@ Outstanding ones only. * Add Net::HTTP#verify_hostname= and Net::HTTP#verify_hostname to skip hostname verification. [[Feature #16555]] + * Modified method + + * Net::HTTP.get, Net::HTTP.get_response, and Net::HTTP.get_print can + take request headers as Hash in the second argument when the first + argument is an URI. + ## Compatibility issues Excluding feature bug fixes. diff --git a/lib/net/http.rb b/lib/net/http.rb index a1d1d3e9c5..aac626e538 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -427,7 +427,7 @@ class << HTTP # # Gets the body text from the target and outputs it to $stdout. The # target can either be specified as - # (+uri+), or as (+host+, +path+, +port+ = 80); so: + # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so: # # Net::HTTP.get_print URI('http://www.example.com/index.html') # @@ -435,8 +435,12 @@ class << HTTP # # Net::HTTP.get_print 'www.example.com', '/index.html' # - def HTTP.get_print(uri_or_host, path = nil, port = nil) - get_response(uri_or_host, path, port) {|res| + # you can also specify request headers: + # + # Net::HTTP.get_print URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' } + # + def HTTP.get_print(uri_or_host, path_or_headers = nil, port = nil) + get_response(uri_or_host, path_or_headers, port) {|res| res.read_body do |chunk| $stdout.print chunk end @@ -446,7 +450,7 @@ def HTTP.get_print(uri_or_host, path = nil, port = nil) # Sends a GET request to the target and returns the HTTP response # as a string. The target can either be specified as - # (+uri+), or as (+host+, +path+, +port+ = 80); so: + # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so: # # print Net::HTTP.get(URI('http://www.example.com/index.html')) # @@ -454,13 +458,17 @@ def HTTP.get_print(uri_or_host, path = nil, port = nil) # # print Net::HTTP.get('www.example.com', '/index.html') # - def HTTP.get(uri_or_host, path = nil, port = nil) - get_response(uri_or_host, path, port).body + # you can also specify request headers: + # + # Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }) + # + def HTTP.get(uri_or_host, path_or_headers = nil, port = nil) + get_response(uri_or_host, path_or_headers, port).body end # Sends a GET request to the target and returns the HTTP response # as a Net::HTTPResponse object. The target can either be specified as - # (+uri+), or as (+host+, +path+, +port+ = 80); so: + # (+uri+, +headers+), or as (+host+, +path+, +port+ = 80); so: # # res = Net::HTTP.get_response(URI('http://www.example.com/index.html')) # print res.body @@ -470,17 +478,23 @@ def HTTP.get(uri_or_host, path = nil, port = nil) # res = Net::HTTP.get_response('www.example.com', '/index.html') # print res.body # - def HTTP.get_response(uri_or_host, path = nil, port = nil, &block) - if path + # you can also specify request headers: + # + # Net::HTTP.get_response(URI('http://www.example.com/index.html'), { 'Accept' => 'text/html' }) + # + def HTTP.get_response(uri_or_host, path_or_headers = nil, port = nil, &block) + if path_or_headers && !path_or_headers.is_a?(Hash) host = uri_or_host + path = path_or_headers new(host, port || HTTP.default_port).start {|http| return http.request_get(path, &block) } else uri = uri_or_host + headers = path_or_headers start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') {|http| - return http.request_get(uri, &block) + return http.request_get(uri, headers, &block) } end end diff --git a/test/net/http/test_http.rb b/test/net/http/test_http.rb index 231aa48557..c05c5f79c6 100644 --- a/test/net/http/test_http.rb +++ b/test/net/http/test_http.rb @@ -283,6 +283,27 @@ def test_s_start def test_s_get assert_equal $test_net_http_data, Net::HTTP.get(config('host'), '/', config('port')) + + assert_equal $test_net_http_data, Net::HTTP.get( + URI.parse("http://#{config('host')}:#{config('port')}") + ) + assert_equal $test_net_http_data, Net::HTTP.get( + URI.parse("http://#{config('host')}:#{config('port')}"), "Accept" => "text/plain" + ) + end + + def test_s_get_response + res = Net::HTTP.get_response( + URI.parse("http://#{config('host')}:#{config('port')}") + ) + assert_equal "application/octet-stream", res["Content-Type"] + assert_equal $test_net_http_data, res.body + + res = Net::HTTP.get_response( + URI.parse("http://#{config('host')}:#{config('port')}"), "Accept" => "text/plain" + ) + assert_equal "text/plain", res["Content-Type"] + assert_equal $test_net_http_data, res.body end def test_head diff --git a/test/net/http/utils.rb b/test/net/http/utils.rb index 53f3be0b88..e343e16712 100644 --- a/test/net/http/utils.rb +++ b/test/net/http/utils.rb @@ -81,7 +81,11 @@ def initialize(this, chunked = false) end def do_GET(req, res) - res['Content-Type'] = $test_net_http_data_type + if req['Accept'] != '*/*' + res['Content-Type'] = req['Accept'] + else + res['Content-Type'] = $test_net_http_data_type + end res.body = $test_net_http_data res.chunked = @chunked end -- GitLab