Skip to content

Commit 1696294

Browse files
committed
Resolve AAAA before A in address_resolve.
1 parent 886d62c commit 1696294

2 files changed

Lines changed: 33 additions & 1 deletion

File tree

lib/async/scheduler.rb

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,26 @@ def address_resolve(hostname)
295295
# On some platforms, hostnames may contain a device-specific suffix (e.g. %en0). We need to strip this before resolving.
296296
# See <https://github.com/socketry/async/issues/180> for more details.
297297
hostname = hostname.split("%", 2).first
298-
::Resolv.getaddresses(hostname)
298+
299+
return [hostname] if ::Resolv::AddressRegex =~ hostname
300+
301+
::Resolv::DefaultResolver.instance_variable_get(:@resolvers).each do |resolver|
302+
addresses = []
303+
304+
if resolver.is_a?(::Resolv::DNS)
305+
[::Resolv::DNS::Resource::IN::AAAA, ::Resolv::DNS::Resource::IN::A].each do |type|
306+
resolver.each_resource(hostname, type) {|resource| addresses << resource.address.to_s}
307+
end
308+
else
309+
resolver.each_address(hostname) {|address| addresses << address.to_s}
310+
ipv6, ipv4 = addresses.partition {|address| address.include?(":")}
311+
addresses = ipv6 + ipv4
312+
end
313+
314+
return addresses unless addresses.empty?
315+
end
316+
317+
return []
299318
end
300319

301320
# Wait for the specified IO to become ready for the specified events.

test/async/scheduler/address.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,17 @@
3434
expect(address.ipv6?).to be == true
3535
end
3636
end
37+
38+
with "#address_resolve" do
39+
it "orders IPv6 addresses before IPv4 addresses" do
40+
addresses = Fiber.scheduler.address_resolve("localhost")
41+
42+
ipv4_index = addresses.index {|address| !address.include?(":")}
43+
ipv6_index = addresses.index {|address| address.include?(":")}
44+
45+
if ipv4_index && ipv6_index
46+
expect(ipv6_index).to be < ipv4_index
47+
end
48+
end
49+
end
3750
end

0 commit comments

Comments
 (0)