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 38 def initialize(family, options) 39 @family = family 40 @record_type = RECORD_TYPES[family] 41 @options = options 42 @connections = [] 43 44 set_resolver_callbacks 45 end
Public Instance methods
each_connection(&block)
[show source]
# File lib/httpx/resolver/resolver.rb 47 def each_connection(&block) 48 enum_for(__method__) unless block 49 50 return unless @connections 51 52 @connections.each(&block) 53 end
emit_addresses(connection, family, addresses, early_resolve = false)
[show source]
# File lib/httpx/resolver/resolver.rb 71 def emit_addresses(connection, family, addresses, early_resolve = false) 72 addresses.map! do |address| 73 address.is_a?(IPAddr) ? address : IPAddr.new(address.to_s) 74 end 75 76 # double emission check, but allow early resolution to work 77 return if !early_resolve && connection.addresses && !addresses.intersect?(connection.addresses) 78 79 log do 80 "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: " \ 81 "answer #{connection.peer.host}: #{addresses.inspect} (early resolve: #{early_resolve})" 82 end 83 84 if !early_resolve && # do not apply resolution delay for non-dns name resolution 85 @current_selector && # just in case... 86 family == Socket::AF_INET && # resolution delay only applies to IPv4 87 !connection.io && # connection already has addresses and initiated/ended handshake 88 connection.options.ip_families.size > 1 && # no need to delay if not supporting dual stack IP 89 addresses.first.to_s != connection.peer.host.to_s # connection URL host is already the IP (early resolve included perhaps?) 90 log { "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: applying resolution delay..." } 91 92 @current_selector.after(0.05) do 93 # double emission check 94 unless connection.addresses && addresses.intersect?(connection.addresses) 95 emit_resolved_connection(connection, addresses, early_resolve) 96 end 97 end 98 else 99 emit_resolved_connection(connection, addresses, early_resolve) 100 end 101 end