Module: HTTPX::Resolver

Extended by:
Resolver
Included in:
Resolver
Defined in:
lib/httpx/resolver.rb,
lib/httpx/resolver/cache.rb,
lib/httpx/resolver/entry.rb

Defined Under Namespace

Modules: Cache Classes: Entry, HTTPS, Multi, Native, Resolver, System

Constant Summary collapse

RESOLVE_TIMEOUT =
[2, 3].freeze

Instance Method Summary collapse

Instance Method Details

#decode_dns_answer(payload) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/httpx/resolver.rb', line 46

def decode_dns_answer(payload)
  begin
    message = Resolv::DNS::Message.decode(payload)
  rescue Resolv::DNS::DecodeError => e
    return :decode_error, e
  end

  # no domain was found
  return :no_domain_found if message.rcode == Resolv::DNS::RCode::NXDomain

  return :message_truncated if message.tc == 1

  if message.rcode != Resolv::DNS::RCode::NoError
    case message.rcode
    when Resolv::DNS::RCode::ServFail
      return :retriable_error, message.rcode
    else
      return :dns_error, message.rcode
    end
  end

  addresses = []

  now = Utils.now
  message.each_answer do |question, _, value|
    case value
    when Resolv::DNS::Resource::IN::CNAME
      addresses << {
        "name" => question.to_s,
        "TTL" => (now + value.ttl),
        "alias" => value.name.to_s,
      }
    when Resolv::DNS::Resource::IN::A,
         Resolv::DNS::Resource::IN::AAAA
      addresses << {
        "name" => question.to_s,
        "TTL" => (now + value.ttl),
        "data" => value.address.to_s,
      }
    end
  end

  [:ok, addresses]
end

#encode_dns_query(hostname, type: Resolv::DNS::Resource::IN::A, message_id: generate_id) ⇒ Object



39
40
41
42
43
44
# File 'lib/httpx/resolver.rb', line 39

def encode_dns_query(hostname, type: Resolv::DNS::Resource::IN::A, message_id: generate_id)
  Resolv::DNS::Message.new(message_id).tap do |query|
    query.rd = 1
    query.add_question(hostname, type)
  end.encode
end

#generate_idObject



30
31
32
33
34
35
36
37
# File 'lib/httpx/resolver.rb', line 30

def generate_id
  if Utils.in_ractor?
    identifier = Ractor.store_if_absent(:httpx_resolver_identifier) { -1 }
    Ractor.current[:httpx_resolver_identifier] = (identifier + 1) & 0xFFFF
  else
    id_synchronize { @identifier = (@identifier + 1) & 0xFFFF }
  end
end

#supported_ip_familiesObject



22
23
24
25
26
27
28
# File 'lib/httpx/resolver.rb', line 22

def supported_ip_families
  if Utils.in_ractor?
    Ractor.store_if_absent(:httpx_supported_ip_families) { find_supported_ip_families }
  else
    @supported_ip_families ||= find_supported_ip_families
  end
end