Base class for all internal internet name resolvers. It handles basic blocks from the Selectable API.
Methods
Public Class
Public Instance
Constants
FAMILY_TYPES | = | { Resolv::DNS::Resource::IN::AAAA => "AAAA", Resolv::DNS::Resource::IN::A => "A", }.freeze | ||
RECORD_TYPES | = | { Socket::AF_INET6 => Resolv::DNS::Resource::IN::AAAA, Socket::AF_INET => Resolv::DNS::Resource::IN::A, }.freeze |
Public Instance Aliases
terminate | -> | close |
Attributes
current_selector | [W] | |
current_session | [W] | |
family | [R] | |
multi | [RW] | |
options | [R] |
Public Class methods
new(family, options)
[show source]
# File lib/httpx/resolver/resolver.rb 37 def initialize(family, options) 38 @family = family 39 @record_type = RECORD_TYPES[family] 40 @options = options 41 @connections = [] 42 43 set_resolver_callbacks 44 end
Public Instance methods
each_connection(&block)
[show source]
# File lib/httpx/resolver/resolver.rb 46 def each_connection(&block) 47 enum_for(__method__) unless block 48 49 return unless @connections 50 51 @connections.each(&block) 52 end
emit_addresses(connection, family, addresses, early_resolve = false)
[show source]
# File lib/httpx/resolver/resolver.rb 70 def emit_addresses(connection, family, addresses, early_resolve = false) 71 addresses.map! { |address| address.is_a?(Resolver::Entry) ? address : Resolver::Entry.new(address) } 72 73 # double emission check, but allow early resolution to work 74 conn_addrs = connection.addresses 75 return if !early_resolve && conn_addrs && (!conn_addrs.empty? && !addresses.intersect?(!conn_addrs)) 76 77 log do 78 "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: " \ 79 "answer #{connection.peer.host}: #{addresses.inspect} (early resolve: #{early_resolve})" 80 end 81 82 if !early_resolve && # do not apply resolution delay for non-dns name resolution 83 @current_selector && # just in case... 84 family == Socket::AF_INET && # resolution delay only applies to IPv4 85 !connection.io && # connection already has addresses and initiated/ended handshake 86 connection.options.ip_families.size > 1 && # no need to delay if not supporting dual stack IP 87 addresses.first.to_s != connection.peer.host.to_s # connection URL host is already the IP (early resolve included perhaps?) 88 log { "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: applying resolution delay..." } 89 90 @current_selector.after(0.05) do 91 # double emission check 92 unless connection.addresses && addresses.intersect?(connection.addresses) 93 emit_resolved_connection(connection, addresses, early_resolve) 94 end 95 end 96 else 97 emit_resolved_connection(connection, addresses, early_resolve) 98 end 99 end