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