class Net::DNS::Question
Name¶ ↑
Net::DNS::Question - DNS packet question class
Synopsis¶ ↑
require 'net/dns/question'
Description¶ ↑
This class represent the Question portion of a
DNS packet. The number of question entries is
stored in the qdCount
variable of an Header object.
A new object can be created passing the name of the query and the type of answer desired, plus an optional argument containing the class:
question = Net::DNS::Question.new("google.com.", Net::DNS::A) #=> "google.com. A IN"
Alternatevly, a new object is created when processing a binary packet, as when an answer is received. To obtain the binary data from a question object you can use the method #data:
question.data #=> "\006google\003com\000\000\001\000\001"
A lot of methods were written to keep a compatibility layer with the Perl version of the library, as long as methods name which are more or less the same.
Attributes
class
part of a Question entry
name
part of a Question entry
type
part of a Question entry
Public Class Methods
If not specified, type
and cls
arguments defaults
to Net::DNS::A and Net::DNS::IN respectively.
# File lib/net/dns/question.rb, line 67 def initialize(name, type = Net::DNS::A, cls = Net::DNS::IN) @qName = check_name name @qType = Net::DNS::RR::Types.new(type) @qClass = Net::DNS::RR::Classes.new(cls) end
Return a new Net::DNS::Question object created by parsing binary data, such as an answer from the nameserver.
question = Net::DNS::Question.parse(data) puts "Queried for #{question.qName} type #{question.qType.to_s}" #=> Queried for example.com type A
# File lib/net/dns/question.rb, line 81 def self.parse(arg) o = allocate o.send(:new_from_binary, arg.to_s) o end
Public Instance Methods
Return the binary data of the objects, plus an offset and an Hash with references to compressed names. For use in Net::DNS::Packet compressed packet creation.
# File lib/net/dns/question.rb, line 99 def comp_data arr = @qName.split(".") str = pack_name(@qName) string = "" names = {} offset = Net::DNS::HFIXEDSZ arr.size.times do |i| x = i+1 elem = arr[-x] len = elem.size string = ((string.reverse)+([len,elem].pack("Ca*")).reverse).reverse names[string] = offset offset += len end offset += 2 * Net::DNS::INT16SZ str += "\000" [[str,@qType.to_i,@qClass.to_i].pack("a*nn"),offset,names] end
Outputs binary data from a Question object
question.data #=> "\006google\003com\000\000\001\000\001"
# File lib/net/dns/question.rb, line 92 def data [pack_name(@qName),@qType.to_i,@qClass.to_i].pack("a*nn") end
Returns a printable version of question with nice formatting.
q = Net::DNS::Question.new("google.com.", Net::DNS::A) q.inspect # => "google.com. IN A "
# File lib/net/dns/question.rb, line 128 def inspect if @qName.size > 29 then len = @qName.size + 1 else len = 29 end [@qName, @qClass.to_s, @qType.to_s].pack("A#{len} A8 A8") end
Returns a string representation of question. It is the same as
inspect
.
q = Net::DNS::Question.new("google.com.", Net::DNS::A) q.inspect # => "google.com. IN A "
# File lib/net/dns/question.rb, line 147 def to_s "#{self.inspect}" end
Private Instance Methods
# File lib/net/dns/question.rb, line 154 def build_qName(str) result = "" offset = 0 loop do len = str.unpack("@#{offset} C")[0] break if len == 0 offset += 1 result += str[offset..offset+len-1] result += "." offset += len end result end
# File lib/net/dns/question.rb, line 168 def check_name(input) name = input.to_s.strip if name =~ /[^\w\.\-_]/ raise NameInvalid, "Invalid Question Name `#{name}'" end name end
# File lib/net/dns/question.rb, line 176 def new_from_binary(data) str,type,cls = data.unpack("a#{data.size - 4}nn") @qName = build_qName(str) @qType = Net::DNS::RR::Types.new type @qClass = Net::DNS::RR::Classes.new cls rescue StandardError => e raise ArgumentError, "Invalid data: #{data.inspect}" end