File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff 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.
Original file line number Diff line number Diff line change 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
3750end
You can’t perform that action at this time.
0 commit comments