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   @resolvers = options.ip_families.map do |ip_family|
19     resolver = resolver_type.new(ip_family, options)
20     resolver.multi = self
21     resolver
22   end
23 
24   @errors = Hash.new { |hs, k| hs[k] = [] }
25 end

Public Instance methods

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