Class: TcpDNS
- Inherits:
-
Resolv::DNS
- Object
- Resolv::DNS
- TcpDNS
- Defined in:
- lib/elbping/tcp_dns.rb
Overview
A TCP-only resolver built from ‘Resolv::DNS`. See the docs for what it’s about. ruby-doc.org/stdlib-1.9.3/libdoc/resolv/rdoc/Resolv/DNS.html
Instance Method Summary collapse
-
#each_resource(name, typeclass, &proc) ⇒ Object
Override fetch_resource to use a TCP requester instead of a UDP requester.
Instance Method Details
#each_resource(name, typeclass, &proc) ⇒ Object
Override fetch_resource to use a TCP requester instead of a UDP requester. This is mostly borrowed from ‘lib/resolv.rb` with the UDP->TCP fallback logic removed.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/elbping/tcp_dns.rb', line 9 def each_resource(name, typeclass, &proc) lazy_initialize senders = {} requester = nil begin @config.resolv(name) { |candidate, tout, nameserver, port| requester = make_tcp_requester(nameserver, port) msg = Message.new msg.rd = 1 msg.add_question(candidate, typeclass) unless sender = senders[[candidate, nameserver, port]] sender = senders[[candidate, nameserver, port]] = requester.sender(msg, candidate, nameserver, port) end begin # HACK reply, reply_name = requester.request(sender, tout) rescue return end case reply.rcode when RCode::NoError extract_resources(reply, reply_name, typeclass, &proc) return when RCode::NXDomain raise Config::NXDomain.new(reply_name.to_s) else raise Config::OtherResolvError.new(reply_name.to_s) end } ensure requester.close unless requester.nil? end end |