Class: Resolv::DNS

Inherits:
Object
  • Object
show all
Defined in:
lib/rubydns/extensions/resolv-1.8.rb,
lib/rubydns/extensions/resolv-1.9.rb

Defined Under Namespace

Classes: Message

Instance Method Summary collapse

Instance Method Details

#each_resource(name, typeclass, &proc) ⇒ Object



68
69
70
71
72
# File 'lib/rubydns/extensions/resolv-1.9.rb', line 68

def each_resource(name, typeclass, &proc)
	fetch_resource(name, typeclass) do |reply, reply_name|
		extract_resources(reply, reply_name, typeclass, &proc)
	end
end

#fetch_resource(name, typeclass) ⇒ Object

This issue was not fixed in 1.9.3 but the proposed patch works as expected: bugs.ruby-lang.org/issues/4788



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/rubydns/extensions/resolv-1.9.rb', line 27

def fetch_resource(name, typeclass)
	lazy_initialize
	requester = make_udp_requester
	senders = {}
	begin
		@config.resolv(name) {|candidate, tout, 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
			reply, reply_name = requester.request(sender, tout)
			case reply.rcode
			when RCode::NoError
				if reply.tc == 1 and not Requester::TCP === requester
					requester.close
					# Retry via TCP:
					requester = make_tcp_requester(nameserver, port)
					senders = {}
					# This will use TCP for all remaining candidates (assuming the
					# current candidate does not already respond successfully via
					# TCP).  This makes sense because we already know the full
					# response will not fit in an untruncated UDP packet.
					redo
				else
					yield(reply, reply_name)
				end
				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
	end
end

#query(name, typeclass) ⇒ Object

Queries the given DNS server and returns its response in its entirety. This allows such responses to be passed upstream with little or no modification/reinterpretation.



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/rubydns/extensions/resolv-1.8.rb', line 28

def query(name, typeclass)
	lazy_initialize
	requester = make_requester
	senders = {}
	begin
		@config.resolv(name) {|candidate, tout, nameserver|
			msg = Message.new
			msg.rd = 1
			msg.add_question(candidate, typeclass)
			unless sender = senders[[candidate, nameserver]]
				sender = senders[[candidate, nameserver]] =
				requester.sender(msg, candidate, nameserver)
			end
			reply, reply_name = requester.request(sender, tout)

			return reply, reply_name
		}
	ensure
		requester.close
	end
end