Class: Net::DNS::Question

Inherits:
Object
  • Object
show all
Includes:
Names
Defined in:
lib/net/dns/question.rb

Overview

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 Question#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.

Defined Under Namespace

Classes: Error, NameInvalid

Constant Summary

Constants included from Names

Names::INT16SZ

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Names

#dn_comp, #dn_expand, #names_array, #pack_name, #valid?

Constructor Details

#initialize(name, type = Net::DNS::A, cls = Net::DNS::IN) ⇒ Question

If not specified, type and cls arguments defaults to Net::DNS::A and Net::DNS::IN respectively.



66
67
68
69
70
# File 'lib/net/dns/question.rb', line 66

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

Instance Attribute Details

#qClassObject (readonly)

class part of a Question entry



52
53
54
# File 'lib/net/dns/question.rb', line 52

def qClass
  @qClass
end

#qNameObject (readonly)

name part of a Question entry



48
49
50
# File 'lib/net/dns/question.rb', line 48

def qName
  @qName
end

#qTypeObject (readonly)

type part of a Question entry



50
51
52
# File 'lib/net/dns/question.rb', line 50

def qType
  @qType
end

Class Method Details

.parse(arg) ⇒ Object

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


80
81
82
83
84
# File 'lib/net/dns/question.rb', line 80

def self.parse(arg)
  o = allocate
  o.send(:new_from_binary, arg.to_s)
  o
end

Instance Method Details

#comp_dataObject

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.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/net/dns/question.rb', line 98

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

#dataObject

Outputs binary data from a Question object

question.data
   #=> "\006google\003com\000\000\001\000\001"


91
92
93
# File 'lib/net/dns/question.rb', line 91

def data
  [pack_name(@qName), @qType.to_i, @qClass.to_i].pack("a*nn")
end

#inspectObject

call-seq:

question.inspect -> string

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       "


126
127
128
129
130
131
132
133
# File 'lib/net/dns/question.rb', line 126

def inspect
  len = if @qName.size > 29
    @qName.size + 1
  else
    29
  end
  [@qName, @qClass.to_s, @qType.to_s].pack("A#{len} A8 A8")
end

#to_sObject

call-seq:

question.to_s -> string

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       "


145
146
147
# File 'lib/net/dns/question.rb', line 145

def to_s
  inspect.to_s
end