ruby-changes:60361
From: Takashi <ko1@a...>
Date: Wed, 11 Mar 2020 14:26:40 +0900 (JST)
Subject: [ruby-changes:60361] e0512b29aa (master): Let Net::HTTP.get take request headers (#2957)
https://git.ruby-lang.org/ruby.git/commit/?id=e0512b29aa From e0512b29aa47d4b79a27b0c0356bf47ec9b4e072 Mon Sep 17 00:00:00 2001 From: Takashi Kokubun <takashikkbn@g...> Date: Wed, 11 Mar 2020 14:26:22 +0900 Subject: 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] diff --git a/NEWS.md b/NEWS.md index 70da707..26274c4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -98,6 +98,12 @@ Outstanding ones only. https://github.com/ruby/ruby/blob/trunk/NEWS.md#L98 * 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 a1d1d3e..aac626e 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -427,7 +427,7 @@ module Net #:nodoc: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L427 # # 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: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L435 # # 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: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L450 # 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: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L458 # # 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: https://github.com/ruby/ruby/blob/trunk/lib/net/http.rb#L478 # 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 231aa48..c05c5f7 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 https://github.com/ruby/ruby/blob/trunk/test/net/http/test_http.rb#L283 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 53f3be0..e343e16 100644 --- a/test/net/http/utils.rb +++ b/test/net/http/utils.rb @@ -81,7 +81,11 @@ module TestNetHTTPUtils https://github.com/ruby/ruby/blob/trunk/test/net/http/utils.rb#L81 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 -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/