module HTTPX::Resolver

  1. lib/httpx/resolver.rb
  2. lib/httpx/resolver/cache.rb
  3. lib/httpx/resolver/cache/base.rb
  4. lib/httpx/resolver/cache/file.rb
  5. lib/httpx/resolver/cache/memory.rb
  6. lib/httpx/resolver/entry.rb
  7. lib/httpx/resolver/https.rb
  8. lib/httpx/resolver/multi.rb
  9. lib/httpx/resolver/native.rb
  10. lib/httpx/resolver/resolver.rb
  11. lib/httpx/resolver/system.rb
  12. lib/httpx/selector.rb
  13. show all

Constants

RESOLVE_TIMEOUT = [2, 3].freeze  

Public Instance methods

decode_dns_answer(payload)
[show source]
   # File lib/httpx/resolver.rb
46 def decode_dns_answer(payload)
47   begin
48     message = Resolv::DNS::Message.decode(payload)
49   rescue Resolv::DNS::DecodeError => e
50     return :decode_error, e
51   end
52 
53   # no domain was found
54   return :no_domain_found if message.rcode == Resolv::DNS::RCode::NXDomain
55 
56   return :message_truncated if message.tc == 1
57 
58   if message.rcode != Resolv::DNS::RCode::NoError
59     case message.rcode
60     when Resolv::DNS::RCode::ServFail,
61          # getaddrinfo also retries these errors, as they're not about the hostname being resolved,
62          # but the DNS resolver state.
63          Resolv::DNS::RCode::NotImp,
64          Resolv::DNS::RCode::Refused
65       return :retriable_error, message.rcode
66     else
67       return :dns_error, message.rcode
68     end
69   end
70 
71   addresses = []
72 
73   now = Utils.now
74   message.each_answer do |question, _, value|
75     case value
76     when Resolv::DNS::Resource::IN::CNAME
77       addresses << {
78         "name" => question.to_s,
79         "TTL" => (now + value.ttl),
80         "alias" => value.name.to_s,
81       }
82     when Resolv::DNS::Resource::IN::A,
83          Resolv::DNS::Resource::IN::AAAA
84       addresses << {
85         "name" => question.to_s,
86         "TTL" => (now + value.ttl),
87         "data" => value.address.to_s,
88       }
89     end
90   end
91 
92   [:ok, addresses]
93 end
encode_dns_query(hostname, type: Resolv::DNS::Resource::IN::A, message_id: generate_id)
[show source]
   # File lib/httpx/resolver.rb
39 def encode_dns_query(hostname, type: Resolv::DNS::Resource::IN::A, message_id: generate_id)
40   Resolv::DNS::Message.new(message_id).tap do |query|
41     query.rd = 1
42     query.add_question(hostname, type)
43   end.encode
44 end
generate_id()
[show source]
   # File lib/httpx/resolver.rb
30 def generate_id
31   if Utils.in_ractor?
32     identifier = Ractor.store_if_absent(:httpx_resolver_identifier) { -1 }
33     Ractor.current[:httpx_resolver_identifier] = (identifier + 1) & 0xFFFF
34   else
35     id_synchronize { @identifier = (@identifier + 1) & 0xFFFF }
36   end
37 end
supported_ip_families()
[show source]
   # File lib/httpx/resolver.rb
22 def supported_ip_families
23   if Utils.in_ractor?
24     Ractor.store_if_absent(:httpx_supported_ip_families) { find_supported_ip_families }
25   else
26     @supported_ip_families ||= find_supported_ip_families
27   end
28 end