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 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.
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 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
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 80 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 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
Outputs binary data from a Question
object
question.data #=> "\006google\003com\000\000\001\000\001"
# File lib/net/dns/question.rb, line 91 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 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
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 145 def to_s inspect.to_s end
Private Instance Methods
# File lib/net/dns/question.rb, line 151 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 166 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 175 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