class HTTPX::Resolver::Multi

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

Included modules

  1. Callbacks

Attributes

options [R]
resolvers [R]

Public Class methods

new(resolver_type, options)
[show source]
   # File lib/httpx/resolver/multi.rb
13 def initialize(resolver_type, options)
14   @current_selector = nil
15   @current_session = nil
16   @options = options
17   @resolver_options = @options.resolver_options
18 
19   @resolvers = options.ip_families.map do |ip_family|
20     resolver = resolver_type.new(ip_family, options)
21     resolver.multi = self
22     resolver
23   end
24 
25   @errors = Hash.new { |hs, k| hs[k] = [] }
26 end

Public Instance methods

close()
[show source]
   # File lib/httpx/resolver/multi.rb
54 def close
55   @resolvers.each(&:close)
56 end
closed?()
[show source]
   # File lib/httpx/resolver/multi.rb
38 def closed?
39   @resolvers.all?(&:closed?)
40 end
connections()
[show source]
   # File lib/httpx/resolver/multi.rb
58 def connections
59   @resolvers.filter_map { |r| r.resolver_connection if r.respond_to?(:resolver_connection) }
60 end
current_selector=(s)
[show source]
   # File lib/httpx/resolver/multi.rb
28 def current_selector=(s)
29   @current_selector = s
30   @resolvers.each { |r| r.__send__(__method__, s) }
31 end
current_session=(s)
[show source]
   # File lib/httpx/resolver/multi.rb
33 def current_session=(s)
34   @current_session = s
35   @resolvers.each { |r| r.__send__(__method__, s) }
36 end
early_resolve(connection)
[show source]
   # File lib/httpx/resolver/multi.rb
62 def early_resolve(connection)
63   hostname = connection.peer.host
64   addresses = @resolver_options[:cache] && (connection.addresses || HTTPX::Resolver.nolookup_resolve(hostname))
65   return false unless addresses
66 
67   resolved = false
68   addresses.group_by(&:family).sort { |(f1, _), (f2, _)| f2 <=> f1 }.each do |family, addrs|
69     # try to match the resolver by family. However, there are cases where that's not possible, as when
70     # the system does not have IPv6 connectivity, but it does support IPv6 via loopback/link-local.
71     resolver = @resolvers.find { |r| r.family == family } || @resolvers.first
72 
73     next unless resolver # this should ever happen
74 
75     # it does not matter which resolver it is, as early-resolve code is shared.
76     resolver.emit_addresses(connection, family, addrs, true)
77 
78     resolved = true
79   end
80 
81   resolved
82 end
empty?()
[show source]
   # File lib/httpx/resolver/multi.rb
42 def empty?
43   @resolvers.all?(&:empty?)
44 end
inflight?()
[show source]
   # File lib/httpx/resolver/multi.rb
46 def inflight?
47   @resolvers.any(&:inflight?)
48 end
lazy_resolve(connection)
[show source]
   # File lib/httpx/resolver/multi.rb
84 def lazy_resolve(connection)
85   @resolvers.each do |resolver|
86     resolver << @current_session.try_clone_connection(connection, @current_selector, resolver.family)
87     next if resolver.empty?
88 
89     @current_session.select_resolver(resolver, @current_selector)
90   end
91 end
timeout()
[show source]
   # File lib/httpx/resolver/multi.rb
50 def timeout
51   @resolvers.filter_map(&:timeout).min
52 end