diff options
| author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2024-11-11 20:41:12 +0100 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2024-11-14 11:21:39 +0900 |
| commit | 0ef7d59ef2230db26162c2b17338cfdda7abc9e8 (patch) | |
| tree | e40f74b9ff16502b4779dac7c67d12d4ab0c16c2 /lib | |
| parent | 26036b1248598bd0788681f7902b5874a16a7736 (diff) | |
Update vendored resolv to 0.5.0
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/rubygems/vendor/resolv/lib/resolv.rb | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/lib/rubygems/vendor/resolv/lib/resolv.rb b/lib/rubygems/vendor/resolv/lib/resolv.rb index 0f5ded3b76..fc772b3056 100644 --- a/lib/rubygems/vendor/resolv/lib/resolv.rb +++ b/lib/rubygems/vendor/resolv/lib/resolv.rb @@ -37,7 +37,7 @@ end class Gem::Resolv - VERSION = "0.4.0" + VERSION = "0.5.0" ## # Looks up the first IP address for +name+. @@ -396,13 +396,15 @@ class Gem::Resolv # be a Gem::Resolv::IPv4 or Gem::Resolv::IPv6 def each_address(name) - each_resource(name, Resource::IN::A) {|resource| yield resource.address} if use_ipv6? each_resource(name, Resource::IN::AAAA) {|resource| yield resource.address} end + each_resource(name, Resource::IN::A) {|resource| yield resource.address} end def use_ipv6? # :nodoc: + @config.lazy_initialize unless @config.instance_variable_get(:@initialized) + use_ipv6 = @config.use_ipv6? unless use_ipv6.nil? return use_ipv6 @@ -513,35 +515,40 @@ class Gem::Resolv def fetch_resource(name, typeclass) lazy_initialize - begin - requester = make_udp_requester + truncated = {} + requesters = {} + udp_requester = begin + make_udp_requester rescue Errno::EACCES # fall back to TCP end senders = {} + begin - @config.resolv(name) {|candidate, tout, nameserver, port| - requester ||= make_tcp_requester(nameserver, port) + @config.resolv(name) do |candidate, tout, nameserver, port| msg = Message.new msg.rd = 1 msg.add_question(candidate, typeclass) - unless sender = senders[[candidate, nameserver, port]] + + requester = requesters.fetch([nameserver, port]) do + if !truncated[candidate] && udp_requester + udp_requester + else + requesters[[nameserver, port]] = make_tcp_requester(nameserver, port) + end + end + + unless sender = senders[[candidate, requester, nameserver, port]] sender = requester.sender(msg, candidate, nameserver, port) next if !sender - senders[[candidate, nameserver, port]] = sender + senders[[candidate, requester, nameserver, port]] = sender end reply, reply_name = requester.request(sender, tout) case reply.rcode when RCode::NoError if reply.tc == 1 and not Requester::TCP === requester - requester.close # Retry via TCP: - requester = make_tcp_requester(nameserver, port) - senders = {} - # This will use TCP for all remaining candidates (assuming the - # current candidate does not already respond successfully via - # TCP). This makes sense because we already know the full - # response will not fit in an untruncated UDP packet. + truncated[candidate] = true redo else yield(reply, reply_name) @@ -552,9 +559,10 @@ class Gem::Resolv else raise Config::OtherResolvError.new(reply_name.to_s) end - } + end ensure - requester&.close + udp_requester&.close + requesters.each_value { |requester| requester&.close } end end @@ -569,6 +577,11 @@ class Gem::Resolv def make_tcp_requester(host, port) # :nodoc: return Requester::TCP.new(host, port) + rescue Errno::ECONNREFUSED + # Treat a refused TCP connection attempt to a nameserver like a timeout, + # as Gem::Resolv::DNS::Config#resolv considers ResolvTimeout exceptions as a + # hint to try the next nameserver: + raise ResolvTimeout end def extract_resources(msg, name, typeclass) # :nodoc: @@ -1800,7 +1813,6 @@ class Gem::Resolv end end - ## # Base class for SvcParam. [RFC9460] @@ -2499,7 +2511,6 @@ class Gem::Resolv attr_reader :altitude - def encode_rdata(msg) # :nodoc: msg.put_bytes(@version) msg.put_bytes(@ssize.scalar) @@ -3439,4 +3450,3 @@ class Gem::Resolv AddressRegex = /(?:#{IPv4::Regex})|(?:#{IPv6::Regex})/ end - |
