lib/rubydns/resolver.rb in rubydns-0.6.5 vs lib/rubydns/resolver.rb in rubydns-0.6.6
- old
+ new
@@ -38,11 +38,12 @@
@options = options
end
# Provides the next sequence identification number which is used to keep track of DNS messages.
def next_id!
- return (@sequence += 1)
+ # Sequence IDs are 16-bit integers.
+ return (@sequence += 1) % (2**16)
end
# Look up a named resource of the given resource_class.
def query(name, resource_class = Resolv::DNS::Resource::IN::A, &block)
message = Resolv::DNS::Message.new(next_id!)
@@ -113,10 +114,12 @@
def run!
try_next_server!
end
def process_response!(response)
+ finish_request!
+
if Exception === response
@logger.warn "[#{@message.id}] Failure while processing response #{exception}!" if @logger
RubyDNS.log_exception(@logger, response) if @logger
try_next_server!
@@ -127,24 +130,29 @@
elsif response.id != @message.id
@logger.warn "[#{@message.id}] Received response with incorrect message id: #{response.id}" if @logger
try_next_server!
else
- @logger.warn "[#{@message.id}] Received valid response #{response.inspect}" if @logger
+ @logger.debug "[#{@message.id}] Received valid response #{response.inspect}" if @logger
succeed response
end
end
private
- def try_next_server!
+ def finish_request!
+ cancel_timeout
+
+ # Cancel an existing request if it is in flight:
if @request
@request.close_connection
@request = nil
end
-
+ end
+
+ def try_next_server!
if @servers.size > 0
@server = @servers.shift
@logger.debug "[#{@message.id}] Sending request to server #{@server.inspect}" if @logger
@@ -157,13 +165,15 @@
else
raise InvalidProtocolError.new(@server)
end
# Setting up the timeout...
- EventMachine::Timer.new(@timeout) do
+ timeout(@timeout) do
@logger.debug "[#{@message.id}] Request timed out!" if @logger
+ finish_request!
+
try_next_server!
end
else
fail ResolutionFailure.new("No available servers responded to the request.")
end
@@ -187,10 +197,10 @@
end
def receive_data(data)
# Receiving response from remote DNS server...
message = RubyDNS::decode_message(data)
-
+
# The message id must match, and it can't be truncated:
@request.process_response!(message)
rescue Resolv::DNS::DecodeError => error
@request.process_response!(error)
end
\ No newline at end of file