aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Kokubun <takashikkbn@gmail.com>2020-03-11 14:26:22 +0900
committerGitHub <noreply@github.com>2020-03-10 22:26:22 -0700
commite0512b29aa47d4b79a27b0c0356bf47ec9b4e072 (patch)
tree2a2cf5d3a538c8c685cfc3312f65a8216bd8993e
parent12009fb3b984faf346250ee7723ecccf56622ce0 (diff)
downloadruby-e0512b29aa47d4b79a27b0c0356bf47ec9b4e072.tar.gz
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]
-rw-r--r--NEWS.md6
-rw-r--r--lib/net/http.rb34
-rw-r--r--test/net/http/test_http.rb21
-rw-r--r--test/net/http/utils.rb6
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 @@ module Net #:nodoc:
#
# 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 @@ module Net #:nodoc:
#
# 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 @@ module Net #:nodoc:
# 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 @@ module Net #:nodoc:
#
# 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 @@ module Net #:nodoc:
# 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 @@ module TestNetHTTP_version_1_1_methods
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 @@ module TestNetHTTPUtils
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