[ruby/resolv] Support a :use_ipv6 option to Resolv#initialize

When set, supports returning IPv6 results even if there is no
public IPv6 address for the system.

Implements Ruby Feature #14922

https://github.com/ruby/resolv/commit/09d141de38
This commit is contained in:
Jeremy Evans 2019-08-26 20:30:59 -07:00
parent 1b7376423d
commit 87c3deacf4

View File

@ -84,8 +84,8 @@ class Resolv
## ##
# Creates a new Resolv using +resolvers+. # Creates a new Resolv using +resolvers+.
def initialize(resolvers=[Hosts.new, DNS.new]) def initialize(resolvers=nil, use_ipv6: nil)
@resolvers = resolvers @resolvers = resolvers || [Hosts.new, DNS.new(DNS::Config.default_config_hash.merge(use_ipv6: use_ipv6))]
end end
## ##
@ -410,6 +410,11 @@ class Resolv
end end
def use_ipv6? # :nodoc: def use_ipv6? # :nodoc:
use_ipv6 = @config.use_ipv6?
unless use_ipv6.nil?
return use_ipv6
end
begin begin
list = Socket.ip_address_list list = Socket.ip_address_list
rescue NotImplementedError rescue NotImplementedError
@ -1008,6 +1013,7 @@ class Resolv
@mutex.synchronize { @mutex.synchronize {
unless @initialized unless @initialized
@nameserver_port = [] @nameserver_port = []
@use_ipv6 = nil
@search = nil @search = nil
@ndots = 1 @ndots = 1
case @config_info case @config_info
@ -1032,6 +1038,9 @@ class Resolv
if config_hash.include? :nameserver_port if config_hash.include? :nameserver_port
@nameserver_port = config_hash[:nameserver_port].map {|ns, port| [ns, (port || Port)] } @nameserver_port = config_hash[:nameserver_port].map {|ns, port| [ns, (port || Port)] }
end end
if config_hash.include? :use_ipv6
@use_ipv6 = config_hash[:use_ipv6]
end
@search = config_hash[:search] if config_hash.include? :search @search = config_hash[:search] if config_hash.include? :search
@ndots = config_hash[:ndots] if config_hash.include? :ndots @ndots = config_hash[:ndots] if config_hash.include? :ndots
@raise_timeout_errors = config_hash[:raise_timeout_errors] @raise_timeout_errors = config_hash[:raise_timeout_errors]
@ -1088,6 +1097,10 @@ class Resolv
@nameserver_port @nameserver_port
end end
def use_ipv6?
@use_ipv6
end
def generate_candidates(name) def generate_candidates(name)
candidates = nil candidates = nil
name = Name.create(name) name = Name.create(name)