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 = @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