Class Net::DNS::Question
In: lib/net/dns/question.rb
Parent: Object

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.

Error classes

Some error classes has been defined for the Net::DNS::Header class, which are listed here to keep a light and browsable main documentation. We have:

ArgumentError:Argument Error for class Net::DNS::Question
NameError:An error in the name part of a Question entry

Copyright

Copyright (c) 2006 Marco Ceresa

All rights reserved. This program is free software; you may redistribute it and/or modify it under the same terms as Ruby itself.

Methods

comp_data   data   inspect   inspect   new   parse   to_s  

Included Modules

Net::DNS::Names

Classes and Modules

Class Net::DNS::Question::ArgumentError
Class Net::DNS::Question::Error
Class Net::DNS::Question::NameError

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

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

[Source]

# File lib/net/dns/question.rb, line 93
      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

[Source]

# File lib/net/dns/question.rb, line 107
      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.

[Source]

# File lib/net/dns/question.rb, line 136
      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"

[Source]

# File lib/net/dns/question.rb, line 128
      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       "

[Source]

# File lib/net/dns/question.rb, line 165
      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

Known inspect method with nice formatting

[Source]

# File lib/net/dns/question.rb, line 114
      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       "

[Source]

# File lib/net/dns/question.rb, line 184
      def to_s
        "#{self.inspect}"
      end

[Validate]