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
27 def multi?
28   true
29 end
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

close()
[show source]
   # File lib/httpx/resolver/resolver.rb
55 def close; end
closed?()
[show source]
   # File lib/httpx/resolver/resolver.rb
59 def closed?
60   true
61 end
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
empty?()
[show source]
   # File lib/httpx/resolver/resolver.rb
63 def empty?
64   true
65 end
inflight?()
[show source]
   # File lib/httpx/resolver/resolver.rb
67 def inflight?
68   false
69 end