Sha256: d65b6d2c30ecc42348c86c61fe70b591b2b38848a6b71c31dbb2197fa228f174

Contents?: true

Size: 1.72 KB

Versions: 14

Compression:

Stored size: 1.72 KB

Contents

# frozen_string_literal: true

require "forwardable"
require "resolv"

module HTTPX
  class Resolver::Multi
    include Callbacks
    using ArrayExtensions::FilterMap

    attr_reader :resolvers

    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

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

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

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

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

    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

    private

    def on_resolver_connection(connection)
      emit(:resolve, connection)
    end

    def on_resolver_error(connection, error)
      emit(:error, connection, error)
    end

    def on_resolver_close(resolver)
      emit(:close, resolver)
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
httpx-1.1.2 lib/httpx/resolver/multi.rb
httpx-1.1.1 lib/httpx/resolver/multi.rb
httpx-1.1.0 lib/httpx/resolver/multi.rb
httpx-1.0.2 lib/httpx/resolver/multi.rb
httpx-0.24.7 lib/httpx/resolver/multi.rb
httpx-1.0.1 lib/httpx/resolver/multi.rb
httpx-1.0.0 lib/httpx/resolver/multi.rb
httpx-0.24.6 lib/httpx/resolver/multi.rb
httpx-0.24.5 lib/httpx/resolver/multi.rb
httpx-0.24.4 lib/httpx/resolver/multi.rb
httpx-0.24.3 lib/httpx/resolver/multi.rb
httpx-0.24.2 lib/httpx/resolver/multi.rb
httpx-0.24.1 lib/httpx/resolver/multi.rb
httpx-0.24.0 lib/httpx/resolver/multi.rb