Classes and Modules
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