Class: RubyDNS::Resolver::Request

Inherits:
Object
  • Object
show all
Includes:
EventMachine::Deferrable
Defined in:
lib/rubydns/resolver.rb

Overview

Manages a single DNS question message across one or more servers.

Defined Under Namespace

Modules: TCPRequestHandler, UDPRequestHandler

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(message, servers, options = {}, &block) ⇒ Request

Returns a new instance of Request.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/rubydns/resolver.rb', line 96

def initialize(message, servers, options = {}, &block)
	@message = message
	@packet = message.encode
	
	@servers = servers.dup
	
	# We select the protocol based on the size of the data:
	if @packet.bytesize > UDP_TRUNCATION_SIZE
		@servers.delete_if{|server| server[0] == :udp}
	end
	
	# Measured in seconds:
	@timeout = options[:timeout] || 5
	
	@logger = options[:logger]
end

Instance Attribute Details

#loggerObject (readonly)

Returns the value of attribute logger.



115
116
117
# File 'lib/rubydns/resolver.rb', line 115

def logger
  @logger
end

#messageObject (readonly)

Returns the value of attribute message.



113
114
115
# File 'lib/rubydns/resolver.rb', line 113

def message
  @message
end

#packetObject (readonly)

Returns the value of attribute packet.



114
115
116
# File 'lib/rubydns/resolver.rb', line 114

def packet
  @packet
end

Class Method Details

.fetch(*args) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/rubydns/resolver.rb', line 80

def self.fetch(*args)
	request = self.new(*args)
	
	request.callback do |message|
		yield message
	end
	
	request.errback do |error|
		# In the case of a timeout, error will be nil, so we make one up.
		
		yield error
	end
	
	request.run!
end

Instance Method Details

#process_response!(response) ⇒ Object

Once either an exception or message is received, we update the status of this request.



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/rubydns/resolver.rb', line 122

def process_response!(response)
	finish_request!
	
	if Exception === response
		@logger.warn "[#{@message.id}] Failure while processing response #{response}!" if @logger
		RubyDNS.log_exception(@logger, response) if @logger
		
		try_next_server!
	elsif response.tc != 0
		@logger.warn "[#{@message.id}] Received truncated response!" if @logger
		
		try_next_server!
	elsif response.id != @message.id
		@logger.warn "[#{@message.id}] Received response with incorrect message id: #{response.id}" if @logger
		
		try_next_server!
	else
		@logger.debug "[#{@message.id}] Received valid response #{response.inspect}" if @logger
		
		succeed response
	end
end

#run!Object



117
118
119
# File 'lib/rubydns/resolver.rb', line 117

def run!
	try_next_server!
end