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