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

qClass[R]

class part of a Question entry

qName[R]

name part of a Question entry

qType[R]

type part of a Question entry

Public Class Methods

new(name, type = Net::DNS::A, cls = Net::DNS::IN) click to toggle source

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
parse(arg) click to toggle source

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

comp_data() click to toggle source

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
data() click to toggle source

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
inspect → string click to toggle source

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
to_s → string click to toggle source

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

build_qName(str) click to toggle source
# 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
check_name(input) click to toggle source
# 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
new_from_binary(data) click to toggle source
# 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