def query(argument, type = Net::DNS::A, cls = Net::DNS::IN)
if @config[:nameservers].size == 0
raise Resolver::Error, "No nameservers specified!"
end
method = :query_udp
packet = if argument.kind_of? Net::DNS::Packet
argument
else
make_query_packet(argument, type, cls)
end
packet_data = packet.data
packet_size = packet_data.size
if packet_size > @config[:packet_size]
if @raw
@logger.info "Sending #{packet_size} bytes using TCP over RAW socket"
method = :send_raw_tcp
else
@logger.info "Sending #{packet_size} bytes using TCP"
method = :query_tcp
end
else
if @raw
@logger.info "Sending #{packet_size} bytes using UDP over RAW socket"
method = :send_raw_udp
elsif use_tcp?
@logger.info "Sending #{packet_size} bytes using TCP"
method = :query_tcp
else
@logger.info "Sending #{packet_size} bytes using UDP"
end
end
if type == Net::DNS::AXFR
if @raw
@logger.warn "AXFR query, switching to TCP over RAW socket"
method = :send_raw_tcp
else
@logger.warn "AXFR query, switching to TCP"
method = :query_tcp
end
end
ans = self.send(method, packet, packet_data)
unless ans
message = "No response from nameservers list"
@logger.fatal(message)
raise NoResponseError, message
end
@logger.info "Received #{ans[0].size} bytes from #{ans[1][2]+":"+ans[1][1].to_s}"
response = Net::DNS::Packet.parse(ans[0],ans[1])
if response.header.truncated? and not ignore_truncated?
@logger.warn "Packet truncated, retrying using TCP"
self.use_tcp = true
begin
return query(argument,type,cls)
ensure
self.use_tcp = false
end
end
return response
end