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:

  • QuestionArgumentError: generic argument error
  • QuestionNameError: 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   new   parse  

Included Modules

Net::DNS::Names

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 85
      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 99
      def self.parse(arg)
        if arg.kind_of? String
          o = allocate
          o.send(:new_from_binary,arg)
          o
        else
          raise QuestionArgumentError, "Wrong argument format, must be a String"
        end
      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 132
      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 124
      def data
        [pack_name(@qName),@qType.to_i,@qClass.to_i].pack("a*nn")
      end

Known inspect method with nice formatting

[Source]

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

[Validate]