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

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/

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