Skip to content

Commit f880630

Browse files
committed
Add hosts records to resolver cache.
1 parent 4156465 commit f880630

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

lib/async/dns/cache.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ def age(now)
1313
end
1414

1515
def fresh?(now = Async::Clock.now)
16-
self.age(now) <= resource.ttl
16+
if ttl = resource.ttl
17+
self.age(now) <= ttl
18+
else
19+
true
20+
end
1721
end
1822
end
1923

lib/async/dns/system.rb

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def self.ipv6?
3737
list.any? {|a| a.ipv6? && !a.ipv6_loopback? && !a.ipv6_linklocal? }
3838
end
3939

40+
Resource = Struct.new(:address, :ttl)
41+
4042
# An interface for querying the system's hosts file.
4143
class Hosts
4244
# Hosts for the local system.
@@ -84,17 +86,31 @@ def add(address, names)
8486
@addresses[address] += names
8587

8688
names.each do |name|
89+
name = Resolv::DNS::Name.create(name).with_origin(nil)
90+
8791
@names[name] ||= []
8892
@names[name] << address
8993
end
9094
end
9195

96+
def each(&block)
97+
@names.each(&block)
98+
end
99+
92100
# Parse a hosts file and add the entries.
93101
def parse_hosts(io)
94102
io.each do |line|
95103
line.sub!(/#.*/, '')
96104
address, hostname, *aliases = line.split(/\s+/)
97105

106+
if address =~ Resolv::IPv4::Regex
107+
address = Resolv::IPv4.create(address)
108+
elsif address =~ Resolv::IPv6::Regex
109+
address = Resolv::IPv6.create(address)
110+
else
111+
next
112+
end
113+
98114
add(address, [hostname] + aliases)
99115
end
100116
end
@@ -169,6 +185,24 @@ def self.resolver(**options)
169185
options[:search] = [nil]
170186
end
171187

188+
if hosts = Hosts.local
189+
cache = options.fetch(:cache) do
190+
options[:cache] = Cache.new
191+
end
192+
193+
hosts.each do |name, addresses|
194+
addresses.each do |address|
195+
resource = Resource.new(address, nil)
196+
case address
197+
when Resolv::IPv4
198+
cache.store(name, Resolv::DNS::Resource::IN::A, resource)
199+
when Resolv::IPv6
200+
cache.store(name, Resolv::DNS::Resource::IN::AAAA, resource)
201+
end
202+
end
203+
end
204+
end
205+
172206
timeout = options.delete(:timeout) || DEFAULT_TIMEOUT
173207
endpoint = Endpoint.for(nameservers, timeout: timeout)
174208

0 commit comments

Comments
 (0)