Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion lib/cool.io/dns_resolver.rb
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,9 @@ def self.hosts(host, hostfile = Resolv::Hosts::DefaultFileName)
# list of nameservers to query. By default the resolver will
# use nameservers listed in /etc/resolv.conf
def initialize(hostname, *nameservers)
nameservers = reject_ipv6_nameservers(nameservers)
if nameservers.empty?
nameservers = Resolv::DNS::Config.default_config_hash[:nameserver]
nameservers = reject_ipv6_nameservers(Resolv::DNS::Config.default_config_hash[:nameserver])
raise RuntimeError, "no nameservers found" if nameservers.empty? # TODO just call resolve_failed, not raise [also handle Errno::ENOENT)]
end

Expand Down Expand Up @@ -203,6 +204,12 @@ def response_address(message)
nil
end

private

def reject_ipv6_nameservers(nameservers)
nameservers.reject { |ns| ns.include?(':') }
end

class Timeout < TimerWatcher
def initialize(resolver)
@resolver = resolver
Expand Down
20 changes: 20 additions & 0 deletions spec/dns_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,24 @@ def on_resolve_failed
expect( Coolio::DNSResolver.hosts("localhost", file.path)).to eq @preferred_localhost_address
end
end

describe "IPv6 nameserver filtering" do
it "ignores IPv6 nameservers provided in arguments" do
resolver = Coolio::DNSResolver.new("example.com", "8.8.8.8", "2001:4860:4860::8888", "1.1.1.1")

nameservers = resolver.instance_variable_get(:@nameservers)
expect(nameservers).to eq(["8.8.8.8", "1.1.1.1"])
end

it "falls back to default IPv4 config if only IPv6 addresses are provided" do
allow(Resolv::DNS::Config).to receive(:default_config_hash).and_return({
nameserver: ["8.8.4.4", "2001:4860:4860::8844"]
})

resolver = Coolio::DNSResolver.new("example.com", "2001:4860:4860::8888")

nameservers = resolver.instance_variable_get(:@nameservers)
expect(nameservers).to eq(["8.8.4.4"])
end
end
end
Loading