Warn open-uri's "open" method at Kernel.

Use URI.open instead.

Thanks for the patch by jeremyevans0 (Jeremy Evans) [Misc #15893].
This commit is contained in:
Tanaka Akira 2019-07-14 17:18:17 +09:00
Родитель 9987296b8b
Коммит 05aac90a1b
3 изменённых файлов: 85 добавлений и 64 удалений

Просмотреть файл

@ -10,6 +10,21 @@ module Kernel
alias open_uri_original_open open # :nodoc:
end
def open(name, *rest, &block) # :nodoc:
if (name.respond_to?(:open) && !name.respond_to?(:to_path)) ||
(name.respond_to?(:to_str) &&
%r{\A[A-Za-z][A-Za-z0-9+\-\.]*://} =~ name &&
(uri = URI.parse(name)).respond_to?(:open))
warn('calling URI.open via Kernel#open is deprecated, call URI.open directly', uplevel: 1)
URI.open(name, *rest, &block)
else
open_uri_original_open(name, *rest, &block)
end
end
module_function :open
end
module URI
# Allows the opening of various resources including URIs.
#
# If the first argument responds to the 'open' method, 'open' is called on
@ -26,7 +41,7 @@ module Kernel
#
# We can accept URIs and strings that begin with http://, https:// and
# ftp://. In these cases, the opened file object is extended by OpenURI::Meta.
def open(name, *rest, &block) # :doc:
def self.open(name, *rest, &block)
if name.respond_to?(:open)
name.open(*rest, &block)
elsif name.respond_to?(:to_str) &&
@ -35,16 +50,10 @@ module Kernel
uri.open(*rest, &block)
else
open_uri_original_open(name, *rest, &block)
# After Kernel#open override is removed:
#super
end
end
module_function :open
end
module URI #:nodoc:
# alias for Kernel.open defined in open-uri.
def self.open(name, *rest, &block)
Kernel.open(name, *rest, &block)
end
end
# OpenURI is an easy-to-use wrapper for Net::HTTP, Net::HTTPS and Net::FTP.

Просмотреть файл

@ -68,6 +68,18 @@ class TestOpenURI < Test::Unit::TestCase
@proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
end
def test_deprecated_kernel_open
with_http {|srv, dr, url|
srv.mount_proc("/foo200", lambda { |req, res| res.body = "foo200" } )
assert_warning(/calling URI.open via Kernel#open is deprecated, call URI.open directly/) {
open("#{url}/foo200") {|f|
assert_equal("200", f.status[0])
assert_equal("foo200", f.read)
}
}
}
end
def test_200_uri_open
with_http {|srv, dr, url|
srv.mount_proc("/urifoo200", lambda { |req, res| res.body = "urifoo200" } )
@ -81,7 +93,7 @@ class TestOpenURI < Test::Unit::TestCase
def test_200
with_http {|srv, dr, url|
srv.mount_proc("/foo200", lambda { |req, res| res.body = "foo200" } )
open("#{url}/foo200") {|f|
URI.open("#{url}/foo200") {|f|
assert_equal("200", f.status[0])
assert_equal("foo200", f.read)
}
@ -92,7 +104,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
content = "foo200big"*10240
srv.mount_proc("/foo200big", lambda { |req, res| res.body = content } )
open("#{url}/foo200big") {|f|
URI.open("#{url}/foo200big") {|f|
assert_equal("200", f.status[0])
assert_equal(content, f.read)
}
@ -105,7 +117,7 @@ class TestOpenURI < Test::Unit::TestCase
assert_match(%r{ERROR `/not-exist' not found}, server_log[0])
}
with_http(log_tester) {|srv, dr, url, server_thread, server_log|
exc = assert_raise(OpenURI::HTTPError) { open("#{url}/not-exist") {} }
exc = assert_raise(OpenURI::HTTPError) { URI.open("#{url}/not-exist") {} }
assert_equal("404", exc.io.status[0])
}
end
@ -114,7 +126,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
srv.mount_proc("/foo_ou", lambda { |req, res| res.body = "foo_ou" } )
u = URI("#{url}/foo_ou")
open(u) {|f|
URI.open(u) {|f|
assert_equal("200", f.status[0])
assert_equal("foo_ou", f.read)
}
@ -122,7 +134,7 @@ class TestOpenURI < Test::Unit::TestCase
end
def test_open_too_many_arg
assert_raise(ArgumentError) { open("http://192.0.2.1/tma", "r", 0666, :extra) {} }
assert_raise(ArgumentError) { URI.open("http://192.0.2.1/tma", "r", 0666, :extra) {} }
end
def test_read_timeout
@ -169,28 +181,28 @@ class TestOpenURI < Test::Unit::TestCase
end
def test_invalid_option
assert_raise(ArgumentError) { open("http://127.0.0.1/", :invalid_option=>true) {} }
assert_raise(ArgumentError) { URI.open("http://127.0.0.1/", :invalid_option=>true) {} }
end
def test_mode
with_http {|srv, dr, url|
srv.mount_proc("/mode", lambda { |req, res| res.body = "mode" } )
open("#{url}/mode", "r") {|f|
URI.open("#{url}/mode", "r") {|f|
assert_equal("200", f.status[0])
assert_equal("mode", f.read)
}
open("#{url}/mode", "r", 0600) {|f|
URI.open("#{url}/mode", "r", 0600) {|f|
assert_equal("200", f.status[0])
assert_equal("mode", f.read)
}
assert_raise(ArgumentError) { open("#{url}/mode", "a") {} }
open("#{url}/mode", "r:us-ascii") {|f|
assert_raise(ArgumentError) { URI.open("#{url}/mode", "a") {} }
URI.open("#{url}/mode", "r:us-ascii") {|f|
assert_equal(Encoding::US_ASCII, f.read.encoding)
}
open("#{url}/mode", "r:utf-8") {|f|
URI.open("#{url}/mode", "r:utf-8") {|f|
assert_equal(Encoding::UTF_8, f.read.encoding)
}
assert_raise(ArgumentError) { open("#{url}/mode", "r:invalid-encoding") {} }
assert_raise(ArgumentError) { URI.open("#{url}/mode", "r:invalid-encoding") {} }
}
end
@ -198,7 +210,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
srv.mount_proc("/without_block", lambda { |req, res| res.body = "without_block" } )
begin
f = open("#{url}/without_block")
f = URI.open("#{url}/without_block")
assert_equal("200", f.status[0])
assert_equal("without_block", f.read)
ensure
@ -211,7 +223,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
srv.mount_proc("/close200", lambda { |req, res| res.body = "close200" } )
assert_nothing_raised {
open("#{url}/close200") {|f|
URI.open("#{url}/close200") {|f|
f.close
}
}
@ -223,7 +235,7 @@ class TestOpenURI < Test::Unit::TestCase
content = "close200big"*10240
srv.mount_proc("/close200big", lambda { |req, res| res.body = content } )
assert_nothing_raised {
open("#{url}/close200big") {|f|
URI.open("#{url}/close200big") {|f|
f.close
}
}
@ -235,7 +247,7 @@ class TestOpenURI < Test::Unit::TestCase
myheader2 = nil
with_http {|srv, dr, url|
srv.mount_proc("/h/") {|req, res| myheader2 = req['myheader']; res.body = "foo" }
open("#{url}/h/", 'MyHeader'=>myheader1) {|f|
URI.open("#{url}/h/", 'MyHeader'=>myheader1) {|f|
assert_equal("foo", f.read)
assert_equal(myheader1, myheader2)
}
@ -244,13 +256,13 @@ class TestOpenURI < Test::Unit::TestCase
def test_multi_proxy_opt
assert_raise(ArgumentError) {
open("http://127.0.0.1/", :proxy_http_basic_authentication=>true, :proxy=>true) {}
URI.open("http://127.0.0.1/", :proxy_http_basic_authentication=>true, :proxy=>true) {}
}
end
def test_non_http_proxy
assert_raise(RuntimeError) {
open("http://127.0.0.1/", :proxy=>URI("ftp://127.0.0.1/")) {}
URI.open("http://127.0.0.1/", :proxy=>URI("ftp://127.0.0.1/")) {}
}
end
@ -273,28 +285,28 @@ class TestOpenURI < Test::Unit::TestCase
begin
proxy_thread = proxy.start
srv.mount_proc("/proxy", lambda { |req, res| res.body = "proxy" } )
open("#{url}/proxy", :proxy=>proxy_url) {|f|
URI.open("#{url}/proxy", :proxy=>proxy_url) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
assert_match(/#{Regexp.quote url}/, proxy_auth_log); proxy_auth_log.clear
open("#{url}/proxy", :proxy=>URI(proxy_url)) {|f|
URI.open("#{url}/proxy", :proxy=>URI(proxy_url)) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
assert_match(/#{Regexp.quote url}/, proxy_auth_log); proxy_auth_log.clear
open("#{url}/proxy", :proxy=>nil) {|f|
URI.open("#{url}/proxy", :proxy=>nil) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
assert_equal("", proxy_auth_log); proxy_auth_log.clear
assert_raise(ArgumentError) {
open("#{url}/proxy", :proxy=>:invalid) {}
URI.open("#{url}/proxy", :proxy=>:invalid) {}
}
assert_equal("", proxy_auth_log); proxy_auth_log.clear
with_env("http_proxy"=>proxy_url) {
# should not use proxy for 127.0.0.0/8.
open("#{url}/proxy") {|f|
URI.open("#{url}/proxy") {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
@ -330,7 +342,7 @@ class TestOpenURI < Test::Unit::TestCase
begin
th = proxy.start
srv.mount_proc("/proxy", lambda { |req, res| res.body = "proxy" } )
exc = assert_raise(OpenURI::HTTPError) { open("#{url}/proxy", :proxy=>proxy_url) {} }
exc = assert_raise(OpenURI::HTTPError) { URI.open("#{url}/proxy", :proxy=>proxy_url) {} }
assert_equal("407", exc.io.status[0])
assert_match(/#{Regexp.quote url}/, proxy_auth_log); proxy_auth_log.clear
ensure
@ -363,14 +375,14 @@ class TestOpenURI < Test::Unit::TestCase
begin
th = proxy.start
srv.mount_proc("/proxy", lambda { |req, res| res.body = "proxy" } )
open("#{url}/proxy",
URI.open("#{url}/proxy",
:proxy_http_basic_authentication=>[proxy_url, "user", "pass"]) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
assert_match(/#{Regexp.quote url}/, proxy_auth_log); proxy_auth_log.clear
assert_raise(ArgumentError) {
open("#{url}/proxy",
URI.open("#{url}/proxy",
:proxy_http_basic_authentication=>[true, "user", "pass"]) {}
}
assert_equal("", proxy_auth_log); proxy_auth_log.clear
@ -404,7 +416,7 @@ class TestOpenURI < Test::Unit::TestCase
begin
th = proxy.start
srv.mount_proc("/proxy", lambda { |req, res| res.body = "proxy" } )
open("#{url}/proxy", :proxy => proxy_url) {|f|
URI.open("#{url}/proxy", :proxy => proxy_url) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
@ -423,12 +435,12 @@ class TestOpenURI < Test::Unit::TestCase
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
srv.mount_proc("/r2/") {|req, res| res.body = "r2" }
srv.mount_proc("/to-file/") {|req, res| res.status = 301; res["location"] = "file:///foo" }
open("#{url}/r1/") {|f|
URI.open("#{url}/r1/") {|f|
assert_equal("#{url}/r2", f.base_uri.to_s)
assert_equal("r2", f.read)
}
assert_raise(OpenURI::HTTPRedirect) { open("#{url}/r1/", :redirect=>false) {} }
assert_raise(RuntimeError) { open("#{url}/to-file/") {} }
assert_raise(OpenURI::HTTPRedirect) { URI.open("#{url}/r1/", :redirect=>false) {} }
assert_raise(RuntimeError) { URI.open("#{url}/to-file/") {} }
}
end
@ -436,7 +448,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
srv.mount_proc("/r2/") {|req, res| res.status = 301; res["location"] = "#{url}/r1"; res.body = "r2" }
assert_raise(RuntimeError) { open("#{url}/r1/") {} }
assert_raise(RuntimeError) { URI.open("#{url}/r1/") {} }
}
end
@ -515,7 +527,7 @@ class TestOpenURI < Test::Unit::TestCase
def test_redirect_auth_success
with_http {|srv, dr, url|
setup_redirect_auth(srv, url)
open("#{url}/r2/", :http_basic_authentication=>['user', 'pass']) {|f|
URI.open("#{url}/r2/", :http_basic_authentication=>['user', 'pass']) {|f|
assert_equal("r2", f.read)
}
}
@ -528,7 +540,7 @@ class TestOpenURI < Test::Unit::TestCase
}
with_http(log_tester) {|srv, dr, url, server_thread, server_log|
setup_redirect_auth(srv, url)
exc = assert_raise(OpenURI::HTTPError) { open("#{url}/r2/") {} }
exc = assert_raise(OpenURI::HTTPError) { URI.open("#{url}/r2/") {} }
assert_equal("401", exc.io.status[0])
}
end
@ -540,13 +552,13 @@ class TestOpenURI < Test::Unit::TestCase
}
with_http(log_tester) {|srv, dr, url, server_thread, server_log|
setup_redirect_auth(srv, url)
exc = assert_raise(OpenURI::HTTPError) { open("#{url}/r1/", :http_basic_authentication=>['user', 'pass']) {} }
exc = assert_raise(OpenURI::HTTPError) { URI.open("#{url}/r1/", :http_basic_authentication=>['user', 'pass']) {} }
assert_equal("401", exc.io.status[0])
}
end
def test_userinfo
assert_raise(ArgumentError) { open("http://user:pass@127.0.0.1/") {} }
assert_raise(ArgumentError) { URI.open("http://user:pass@127.0.0.1/") {} }
end
def test_progress
@ -555,7 +567,7 @@ class TestOpenURI < Test::Unit::TestCase
srv.mount_proc("/data/") {|req, res| res.body = content }
length = []
progress = []
open("#{url}/data/",
URI.open("#{url}/data/",
:content_length_proc => lambda {|n| length << n },
:progress_proc => lambda {|n| progress << n }
) {|f|
@ -575,7 +587,7 @@ class TestOpenURI < Test::Unit::TestCase
srv.mount_proc("/data/") {|req, res| res.body = content; res.chunked = true }
length = []
progress = []
open("#{url}/data/",
URI.open("#{url}/data/",
:content_length_proc => lambda {|n| length << n },
:progress_proc => lambda {|n| progress << n }
) {|f|
@ -605,25 +617,25 @@ class TestOpenURI < Test::Unit::TestCase
srv.mount_proc("/u8/") {|req, res| res.body = content_u8; res['content-type'] = 'text/plain; charset=utf-8' }
srv.mount_proc("/ej/") {|req, res| res.body = content_ej; res['content-type'] = 'TEXT/PLAIN; charset=EUC-JP' }
srv.mount_proc("/nc/") {|req, res| res.body = "aa"; res['content-type'] = 'Text/Plain' }
open("#{url}/u8/") {|f|
URI.open("#{url}/u8/") {|f|
assert_equal(content_u8, f.read)
assert_equal("text/plain", f.content_type)
assert_equal("utf-8", f.charset)
}
open("#{url}/ej/") {|f|
URI.open("#{url}/ej/") {|f|
assert_equal(content_ej, f.read)
assert_equal("text/plain", f.content_type)
assert_equal("euc-jp", f.charset)
assert_equal(Encoding::EUC_JP, f.read.encoding)
}
open("#{url}/ej/", 'r:utf-8') {|f|
URI.open("#{url}/ej/", 'r:utf-8') {|f|
# override charset with encoding option
assert_equal(content_ej.dup.force_encoding('utf-8'), f.read)
assert_equal("text/plain", f.content_type)
assert_equal("euc-jp", f.charset)
assert_equal(Encoding::UTF_8, f.read.encoding)
}
open("#{url}/ej/", :encoding=>'utf-8') {|f|
URI.open("#{url}/ej/", :encoding=>'utf-8') {|f|
# override charset with encoding option
assert_equal(content_ej.dup.force_encoding('utf-8'), f.read)
assert_equal("text/plain", f.content_type)
@ -631,9 +643,9 @@ class TestOpenURI < Test::Unit::TestCase
assert_equal(Encoding::UTF_8, f.read.encoding)
}
assert_raise(ArgumentError) {
open("#{url}/ej/", 'r:utf-8', :encoding=>'utf-8') {|f| }
URI.open("#{url}/ej/", 'r:utf-8', :encoding=>'utf-8') {|f| }
}
open("#{url}/nc/") {|f|
URI.open("#{url}/nc/") {|f|
assert_equal("aa", f.read)
assert_equal("text/plain", f.content_type)
assert_equal("iso-8859-1", f.charset)
@ -646,7 +658,7 @@ class TestOpenURI < Test::Unit::TestCase
with_http {|srv, dr, url|
content_u8 = "\u3042"
srv.mount_proc("/qu8/") {|req, res| res.body = content_u8; res['content-type'] = 'text/plain; charset="utf\-8"' }
open("#{url}/qu8/") {|f|
URI.open("#{url}/qu8/") {|f|
assert_equal(content_u8, f.read)
assert_equal("text/plain", f.content_type)
assert_equal("utf-8", f.charset)
@ -657,7 +669,7 @@ class TestOpenURI < Test::Unit::TestCase
def test_last_modified
with_http {|srv, dr, url|
srv.mount_proc("/data/") {|req, res| res.body = "foo"; res['last-modified'] = 'Fri, 07 Aug 2009 06:05:04 GMT' }
open("#{url}/data/") {|f|
URI.open("#{url}/data/") {|f|
assert_equal("foo", f.read)
assert_equal(Time.utc(2009,8,7,6,5,4), f.last_modified)
}
@ -671,15 +683,15 @@ class TestOpenURI < Test::Unit::TestCase
srv.mount_proc("/data/") {|req, res| res.body = content_gz; res['content-encoding'] = 'gzip' }
srv.mount_proc("/data2/") {|req, res| res.body = content_gz; res['content-encoding'] = 'gzip'; res.chunked = true }
srv.mount_proc("/noce/") {|req, res| res.body = content_gz }
open("#{url}/data/") {|f|
URI.open("#{url}/data/") {|f|
assert_equal [], f.content_encoding
assert_equal(content, f.read)
}
open("#{url}/data2/") {|f|
URI.open("#{url}/data2/") {|f|
assert_equal [], f.content_encoding
assert_equal(content, f.read)
}
open("#{url}/noce/") {|f|
URI.open("#{url}/noce/") {|f|
assert_equal [], f.content_encoding
assert_equal(content_gz, f.read.force_encoding("ascii-8bit"))
}
@ -693,7 +705,7 @@ class TestOpenURI < Test::Unit::TestCase
res.cookies << "name2=value2; blabla"
res.body = "foo"
}
open("#{url}/mcookie/") {|f|
URI.open("#{url}/mcookie/") {|f|
assert_equal("foo", f.read)
assert_equal(["name1=value1; blabla", "name2=value2; blabla"],
f.metas['set-cookie'].sort)

Просмотреть файл

@ -67,7 +67,7 @@ class TestOpenURISSL
def setup_validation(srv, dr)
cacert_filename = "#{dr}/cacert.pem"
open(cacert_filename, "w") {|f| f << CA_CERT }
URI.open(cacert_filename, "w") {|f| f << CA_CERT }
srv.mount_proc("/data", lambda { |req, res| res.body = "ddd" } )
cacert_filename
end
@ -75,7 +75,7 @@ class TestOpenURISSL
def test_validation_success
with_https {|srv, dr, url|
cacert_filename = setup_validation(srv, dr)
open("#{url}/data", :ssl_ca_cert => cacert_filename) {|f|
URI.open("#{url}/data", :ssl_ca_cert => cacert_filename) {|f|
assert_equal("200", f.status[0])
assert_equal("ddd", f.read)
}
@ -85,7 +85,7 @@ class TestOpenURISSL
def test_validation_noverify
with_https {|srv, dr, url|
setup_validation(srv, dr)
open("#{url}/data", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) {|f|
URI.open("#{url}/data", :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE) {|f|
assert_equal("200", f.status[0])
assert_equal("ddd", f.read)
}
@ -103,7 +103,7 @@ class TestOpenURISSL
end
with_https(log_tester) {|srv, dr, url, server_thread, server_log|
setup_validation(srv, dr)
assert_raise(OpenSSL::SSL::SSLError) { open("#{url}/data") {} }
assert_raise(OpenSSL::SSL::SSLError) { URI.open("#{url}/data") {} }
}
end
@ -149,7 +149,7 @@ class TestOpenURISSL
}
with_https_proxy(proxy_log_tester) {|srv, dr, url_, cacert_filename, cacert_directory, proxy_host, proxy_port|
url = url_
open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/", :ssl_ca_cert => cacert_filename) {|f|
URI.open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/", :ssl_ca_cert => cacert_filename) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}
@ -165,7 +165,7 @@ class TestOpenURISSL
}
with_https_proxy(proxy_log_tester) {|srv, dr, url_, cacert_filename, cacert_directory, proxy_host, proxy_port|
url = url_
open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/", :ssl_ca_cert => cacert_directory) {|f|
URI.open("#{url}/proxy", :proxy=>"http://#{proxy_host}:#{proxy_port}/", :ssl_ca_cert => cacert_directory) {|f|
assert_equal("200", f.status[0])
assert_equal("proxy", f.read)
}