class Dnsruby::Header

The header portion of a DNS packet

RFC 1035 Section 4.1.1

Constants

MAX_ID

Attributes

aa[RW]

Authoritative answer flag

ad[RW]

The Authenticated Data flag Relevant in DNSSEC context. (The AD bit is only set on answers where signatures have been cryptographically verified or the server is authoritative for the data and is allowed to set the bit by policy.)

adcount[RW]

The number of records in the additional record section og the message

adcount=[RW]

The number of records in the additional record section og the message

ancount[RW]

The number of records in the answer section of the message

arcount[RW]

The number of records in the additional record section og the message

cd[RW]

The Checking Disabled flag

id[RW]

The header ID

nscount[RW]

The number of records in the authoriy section of the message

opcode[R]

The header opcode

prcount[RW]

The number of records in the answer section of the message

prcount=[RW]

The number of records in the answer section of the message

qdcount[RW]

The number of records in the question section of the message

qr[RW]

The query response flag

ra[RW]

Recursion available flag

rd[RW]

Recursion Desired flag

tc[RW]

Truncated flag

upcount[RW]

The number of records in the authoriy section of the message

upcount=[RW]

The number of records in the authoriy section of the message

zocount[RW]

The number of records in the question section of the message

zocount=[RW]

The number of records in the question section of the message

Public Class Methods

decrement_arcount_encoded(bytes) click to toggle source
# File lib/dnsruby/message/header.rb, line 118
def Header.decrement_arcount_encoded(bytes)
  header = Header.new
  header_end = 0
  MessageDecoder.new(bytes) do |msg|
    header.decode(msg)
    header_end = msg.index
  end
  header.arcount -= 1
  bytes[0, header_end] = MessageEncoder.new { |msg| header.encode(msg) }.to_s
  bytes
end
new(*args) click to toggle source
# File lib/dnsruby/message/header.rb, line 61
def initialize(*args)
  if (args.length == 0)
    @id = rand(MAX_ID)
    @qr = false
    @opcode = OpCode.Query
    @aa = false
    @ad = false
    @tc = false
    @rd = false # recursion desired
    @ra = false # recursion available
    @cd = false
    @rcode = RCode.NoError
    @qdcount = 0
    @nscount = 0
    @ancount = 0
    @arcount = 0
  elsif args.length == 1
    decode(args[0])
  end
end
new_from_data(data) click to toggle source
# File lib/dnsruby/message/header.rb, line 90
def Header.new_from_data(data)
  header = Header.new
  MessageDecoder.new(data) { |msg| header.decode(msg) }
  header
end

Public Instance Methods

==(other) click to toggle source
# File lib/dnsruby/message/header.rb, line 130
def ==(other)
  @qr == other.qr &&
      @opcode == other.opcode &&
      @aa == other.aa &&
      @tc == other.tc &&
      @rd == other.rd &&
      @ra == other.ra &&
      @cd == other.cd &&
      @ad == other.ad &&
      @rcode == other.get_header_rcode
end
data() click to toggle source
# File lib/dnsruby/message/header.rb, line 96
def data
  MessageEncoder.new { |msg| self.encode(msg) }.to_s
end
decode(msg) click to toggle source
# File lib/dnsruby/message/header.rb, line 219
def decode(msg)
  @id, flag, @qdcount, @ancount, @nscount, @arcount =
      msg.get_unpack('nnnnnn')
  @qr = ((flag >> 15) & 1) == 1
  @opcode = OpCode.new((flag >> 11) & 15)
  @aa = ((flag >> 10) & 1) == 1
  @tc = ((flag >> 9)  & 1) == 1
  @rd = ((flag >> 8)  & 1) == 1
  @ra = ((flag >> 7)  & 1) == 1
  @ad = ((flag >> 5)  & 1) == 1
  @cd = ((flag >> 4)  & 1) == 1
  @rcode = RCode.new(flag & 15)
end
encode(msg) click to toggle source
# File lib/dnsruby/message/header.rb, line 100
def encode(msg)
  msg.put_pack('nnnnnn',
               @id,
               (@qr ? 1:0) << 15 |
                   (@opcode.code & 15) << 11 |
                   (@aa ? 1:0) << 10 |
                   (@tc ? 1:0) << 9 |
                   (@rd ? 1:0) << 8 |
                   (@ra ? 1:0) << 7 |
                   (@ad ? 1:0) << 5 |
                   (@cd ? 1:0) << 4 |
                   (@rcode.code & 15),
               @qdcount,
               @ancount,
               @nscount,
               @arcount)
end
get_header_rcode() click to toggle source

This new get_header_rcode method is intended for use only by the Message class. This is because the Message OPT section may contain an extended rcode (see RFC 2671 section 4.6). Using the header rcode only ignores this extension, and is not recommended.

# File lib/dnsruby/message/header.rb, line 45
def get_header_rcode
  @rcode
end
old_to_s() click to toggle source
# File lib/dnsruby/message/header.rb, line 146
def old_to_s
  old_to_s_with_rcode(@rcode)
end
old_to_s_with_rcode(rcode) click to toggle source
# File lib/dnsruby/message/header.rb, line 186
def old_to_s_with_rcode(rcode)
  retval = ";; id = #{@id}\n"

  if (@opcode == OpCode::Update)
    retval += ";; qr = #{@qr}    " \
      "opcode = #{@opcode.string}    "\
      "rcode = #{@rcode.string}\n"

    retval += ";; zocount = #{@qdcount}  "\
      "prcount = #{@ancount}  " \
      "upcount = #{@nscount}  "  \
      "adcount = #{@arcount}\n"
  else
    retval += ";; qr = #{@qr}    "  \
      "opcode = #{@opcode.string}    " \
      "aa = #{@aa}    "  \
      "tc = #{@tc}    " \
      "rd = #{@rd}\n"

    retval += ";; ra = #{@ra}    " \
      "ad = #{@ad}    "  \
      "cd = #{@cd}    "  \
      "rcode  = #{rcode.string}\n"

    retval += ";; qdcount = #{@qdcount}  " \
      "ancount = #{@ancount}  " \
      "nscount = #{@nscount}  " \
      "arcount = #{@arcount}\n"
  end

  retval
end
opcode=(op) click to toggle source
# File lib/dnsruby/message/header.rb, line 82
def opcode=(op)
  @opcode = OpCode.new(op)
end
rcode=(rcode) click to toggle source
# File lib/dnsruby/message/header.rb, line 86
def rcode=(rcode)
  @rcode = RCode.new(rcode)
end
to_s() click to toggle source
# File lib/dnsruby/message/header.rb, line 142
def to_s
  to_s_with_rcode(@rcode)
end
to_s_with_rcode(rcode) click to toggle source
# File lib/dnsruby/message/header.rb, line 150
def to_s_with_rcode(rcode)

  if @opcode == OpCode::Update
    s = ";; id = #{@id}\n"
    s << ";; qr = #{@qr}    opcode = #{@opcode.string}    rcode = #{@rcode.string}\n"
    s << ";; zocount = #{@qdcount}  "
    s <<  "prcount = #{@ancount}  "
    s <<  "upcount = #{@nscount}  "
    s <<  "adcount = #{@arcount}\n"
    s
  else

    flags_str = begin
      flags = []
      flags << 'qr' if @qr
      flags << 'aa' if @aa
      flags << 'tc' if @tc
      flags << 'rd' if @rd
      flags << 'ra' if @ra
      flags << 'ad' if @ad
      flags << 'cd' if @cd

      ";; flags: #{flags.join(' ')}; "
    end

    head_line_str =
        ";; ->>HEADER<<- opcode: #{opcode.string.upcase}, status: #{@rcode.string}, id: #{@id}\n"

    section_counts_str =
        "QUERY: #{@qdcount}, ANSWER: #{@ancount}, AUTHORITY: #{@nscount}, ADDITIONAL: #{@arcount}\n"

    head_line_str + flags_str + section_counts_str
  end
end