Class: HTTPX::Resolver::Multi

Inherits:
Object
  • Object
show all
Includes:
Callbacks
Defined in:
lib/httpx/resolver/multi.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Callbacks

#callbacks_for?, #emit, #on, #once, #only

Constructor Details

#initialize(resolver_type, options) ⇒ Multi

Returns a new instance of Multi.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/httpx/resolver/multi.rb', line 13

def initialize(resolver_type, options)
  @options = options
  @resolver_options = @options.resolver_options

  @resolvers = options.ip_families.map do |ip_family|
    resolver = resolver_type.new(ip_family, options)
    resolver.on(:resolve, &method(:on_resolver_connection))
    resolver.on(:error, &method(:on_resolver_error))
    resolver.on(:close) { on_resolver_close(resolver) }
    resolver
  end

  @errors = Hash.new { |hs, k| hs[k] = [] }
end

Instance Attribute Details

#resolversObject (readonly)

Returns the value of attribute resolvers.



11
12
13
# File 'lib/httpx/resolver/multi.rb', line 11

def resolvers
  @resolvers
end

Instance Method Details

#closeObject



36
37
38
# File 'lib/httpx/resolver/multi.rb', line 36

def close
  @resolvers.each(&:close)
end

#closed?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/httpx/resolver/multi.rb', line 28

def closed?
  @resolvers.all?(&:closed?)
end

#connectionsObject



40
41
42
# File 'lib/httpx/resolver/multi.rb', line 40

def connections
  @resolvers.filter_map { |r| r.resolver_connection if r.respond_to?(:resolver_connection) }
end

#early_resolve(connection) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/httpx/resolver/multi.rb', line 44

def early_resolve(connection)
  hostname = connection.origin.host
  addresses = @resolver_options[:cache] && (connection.addresses || HTTPX::Resolver.nolookup_resolve(hostname))
  return unless addresses

  addresses = addresses.group_by(&:family)

  @resolvers.each do |resolver|
    addrs = addresses[resolver.family]

    next if !addrs || addrs.empty?

    resolver.emit_addresses(connection, resolver.family, addrs, true)
  end
end

#timeoutObject



32
33
34
# File 'lib/httpx/resolver/multi.rb', line 32

def timeout
  @resolvers.filter_map(&:timeout).min
end