class Dnsruby::Header
The header portion of a DNS
packet
RFC 1035 Section
4.1.1
Constants
- MAX_ID
Attributes
Authoritative answer flag
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.)
The number of records in the additional record section og the message
The number of records in the additional record section og the message
The number of records in the answer section of the message
The number of records in the additional record section og the message
The Checking Disabled flag
The header ID
The number of records in the authoriy section of the message
The header opcode
The number of records in the answer section of the message
The number of records in the answer section of the message
The number of records in the question section of the message
The query response flag
Recursion available flag
Recursion Desired flag
Truncated flag
The number of records in the authoriy section of the message
The number of records in the authoriy section of the message
The number of records in the question section of the message
The number of records in the question section of the message
Public Class Methods
# 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
# 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
# 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
# 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
# File lib/dnsruby/message/header.rb, line 96 def data MessageEncoder.new { |msg| self.encode(msg) }.to_s end
# 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
# 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
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
# File lib/dnsruby/message/header.rb, line 146 def old_to_s old_to_s_with_rcode(@rcode) end
# 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
# File lib/dnsruby/message/header.rb, line 82 def opcode=(op) @opcode = OpCode.new(op) end
# File lib/dnsruby/message/header.rb, line 86 def rcode=(rcode) @rcode = RCode.new(rcode) end
# File lib/dnsruby/message/header.rb, line 142 def to_s to_s_with_rcode(@rcode) end
# 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