diff --git a/lib/net/http.rb b/lib/net/http.rb index d1e9b2b..22f163b 100644 --- a/lib/net/http.rb +++ b/lib/net/http.rb @@ -22,8 +22,8 @@ require 'net/protocol' require 'uri' -require 'resolv' autoload :OpenSSL, 'openssl' +autoload :Resolv, 'resolv' module Net #:nodoc: diff --git a/test/net/http/test_require.rb b/test/net/http/test_require.rb new file mode 100644 index 0000000..2cfa3c4 --- /dev/null +++ b/test/net/http/test_require.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: false +require 'net/http' +require 'test/unit' + +# Guards the autoload of Resolv in net/http. The checks run in a subprocess +# because this one has resolv loaded already. +class HTTPRequireTest < Test::Unit::TestCase + RESOLV_LOADED = '$LOADED_FEATURES.any? { |f| File.basename(f) == "resolv.rb" }' + + def subprocess(script) + lib = File.expand_path('../../../lib', __dir__) + IO.popen([RbConfig.ruby, '-I', lib, '-e', script], &:read) + end + + def test_requiring_net_http_does_not_load_resolv + assert_equal 'false', subprocess("require 'net/http'; print #{RESOLV_LOADED}") + end + + def test_resolv_is_still_reachable_after_requiring_net_http + script = "require 'net/http'; print Resolv::IPv4::Regex.is_a?(Regexp)" + assert_equal 'true', subprocess(script) + end + + def test_referencing_resolv_loads_it + script = "require 'net/http'; Resolv::IPv4::Regex; print #{RESOLV_LOADED}" + assert_equal 'true', subprocess(script) + end +end