class HTTPX::Resolver::Resolver

  1. lib/httpx/resolver/resolver.rb
Superclass: Object

Base class for all internal internet name resolvers. It handles basic blocks from the Selectable API.

Included modules

  1. Callbacks
  2. Loggable

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

Public Class methods

multi?()
[show source]
   # File lib/httpx/resolver/resolver.rb
26 def multi?
27   true
28 end
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

close()
[show source]
   # File lib/httpx/resolver/resolver.rb
54 def close; end
closed?()
[show source]
   # File lib/httpx/resolver/resolver.rb
58 def closed?
59   true
60 end
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   # do not apply resolution delay for non-dns name resolution
 83   if !early_resolve &&
 84      # just in case...
 85      @current_selector &&
 86      # resolution delay only applies to IPv4
 87      family == Socket::AF_INET &&
 88      # connection already has addresses and initiated/ended handshake
 89      !connection.io &&
 90      # no need to delay if not supporting dual stack / multi-homed IP
 91      (connection.options.ip_families || Resolver.supported_ip_families).size > 1 &&
 92      # connection URL host is already the IP (early resolve included perhaps?)
 93      addresses.first.to_s != connection.peer.host.to_s
 94     log { "resolver #{FAMILY_TYPES[RECORD_TYPES[family]]}: applying resolution delay..." }
 95 
 96     @current_selector.after(0.05) do
 97       # double emission check
 98       unless connection.addresses && addresses.intersect?(connection.addresses)
 99         emit_resolved_connection(connection, addresses, early_resolve)
100       end
101     end
102   else
103     emit_resolved_connection(connection, addresses, early_resolve)
104   end
105 end
empty?()
[show source]
   # File lib/httpx/resolver/resolver.rb
62 def empty?
63   true
64 end
inflight?()
[show source]
   # File lib/httpx/resolver/resolver.rb
66 def inflight?
67   false
68 end