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 = @current_session = nil
15   @options = options
16   @resolver_options = @options.resolver_options
17 
18   ip_families = options.ip_families || Resolver.supported_ip_families
19 
20   @resolvers = ip_families.map do |ip_family|
21     resolver = resolver_type.new(ip_family, options)
22     resolver.multi = self
23     resolver
24   end
25 
26   @errors = Hash.new { |hs, k| hs[k] = [] }
27 end

Public Instance methods

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