Methods
Public Class
Public Instance
Included modules
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