Class: Resolv::DNS::Message
- Inherits:
-
Object
- Object
- Resolv::DNS::Message
- Defined in:
- lib/net/dns/resolv.rb,
lib/net/dns/resolvx.rb
Overview
:nodoc:
Defined Under Namespace
Classes: MessageDecoder, MessageEncoder
Constant Summary collapse
- @@identifier =
-1
Instance Attribute Summary collapse
-
#aa ⇒ Object
Returns the value of attribute aa.
-
#additional ⇒ Object
readonly
Returns the value of attribute additional.
-
#answer ⇒ Object
readonly
Returns the value of attribute answer.
-
#authority ⇒ Object
readonly
Returns the value of attribute authority.
-
#id ⇒ Object
Returns the value of attribute id.
-
#opcode ⇒ Object
Returns the value of attribute opcode.
-
#qr ⇒ Object
Returns the value of attribute qr.
-
#question ⇒ Object
readonly
Returns the value of attribute question.
-
#ra ⇒ Object
Returns the value of attribute ra.
-
#rcode ⇒ Object
Returns the value of attribute rcode.
-
#rd ⇒ Object
Returns the value of attribute rd.
-
#tc ⇒ Object
Returns the value of attribute tc.
Class Method Summary collapse
Instance Method Summary collapse
- #==(other) ⇒ Object
- #add_additional(name, ttl, data) ⇒ Object
- #add_answer(name, ttl, data, cacheflush = false) ⇒ Object
- #add_authority(name, ttl, data) ⇒ Object
- #add_question(name, typeclass, unicast = false) ⇒ Object
- #each_additional ⇒ Object
-
#each_answer ⇒ Object
Can accept either |name, ttl, data| as block arguments (backwards-compatible/DNS-style), or |name, ttl, data, cacheflush| (mDNS-style).
- #each_authority ⇒ Object
-
#each_question ⇒ Object
Can accept either |name, typeclass| as block arguments (backwards-compatible/DNS-style), or |name, typeclass, unicast| (mDNS-style).
- #each_resource ⇒ Object
- #encode ⇒ Object
-
#initialize(id = (@@identifier += 1) & 0xffff) ⇒ Message
constructor
A new instance of Message.
-
#query? ⇒ Boolean
Returns true if message is a query.
-
#response? ⇒ Boolean
Returns true if message is a response.
Constructor Details
#initialize(id = (@@identifier += 1) & 0xffff) ⇒ Message
Returns a new instance of Message.
1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 |
# File 'lib/net/dns/resolv.rb', line 1130 def initialize(id = (@@identifier += 1) & 0xffff) @id = id @qr = 0 @opcode = 0 @aa = 0 @tc = 0 @rd = 0 # recursion desired @ra = 0 # recursion available @rcode = 0 @question = [] @answer = [] @authority = [] @additional = [] end |
Instance Attribute Details
#aa ⇒ Object
Returns the value of attribute aa.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def aa @aa end |
#additional ⇒ Object (readonly)
Returns the value of attribute additional.
1146 1147 1148 |
# File 'lib/net/dns/resolv.rb', line 1146 def additional @additional end |
#answer ⇒ Object (readonly)
Returns the value of attribute answer.
1146 1147 1148 |
# File 'lib/net/dns/resolv.rb', line 1146 def answer @answer end |
#authority ⇒ Object (readonly)
Returns the value of attribute authority.
1146 1147 1148 |
# File 'lib/net/dns/resolv.rb', line 1146 def @authority end |
#id ⇒ Object
Returns the value of attribute id.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def id @id end |
#opcode ⇒ Object
Returns the value of attribute opcode.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def opcode @opcode end |
#qr ⇒ Object
Returns the value of attribute qr.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def qr @qr end |
#question ⇒ Object (readonly)
Returns the value of attribute question.
1146 1147 1148 |
# File 'lib/net/dns/resolv.rb', line 1146 def question @question end |
#ra ⇒ Object
Returns the value of attribute ra.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def ra @ra end |
#rcode ⇒ Object
Returns the value of attribute rcode.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def rcode @rcode end |
#rd ⇒ Object
Returns the value of attribute rd.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def rd @rd end |
#tc ⇒ Object
Returns the value of attribute tc.
1145 1146 1147 |
# File 'lib/net/dns/resolv.rb', line 1145 def tc @tc end |
Class Method Details
.decode(m) ⇒ Object
1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 |
# File 'lib/net/dns/resolv.rb', line 1311 def Message.decode(m) o = Message.new(0) MessageDecoder.new(m) {|msg| id, flag, qdcount, ancount, nscount, arcount = msg.get_unpack('nnnnnn') o.id = id o.qr = (flag >> 15) & 1 o.opcode = (flag >> 11) & 15 o.aa = (flag >> 10) & 1 o.tc = (flag >> 9) & 1 o.rd = (flag >> 8) & 1 o.ra = (flag >> 7) & 1 o.rcode = flag & 15 (1..qdcount).each { name, typeclass, unicast = msg.get_question o.add_question(name, typeclass, unicast) } (1..ancount).each { name, ttl, data, cacheflush = msg.get_rr o.add_answer(name, ttl, data) } (1..nscount).each { name, ttl, data = msg.get_rr o.(name, ttl, data) } (1..arcount).each { name, ttl, data = msg.get_rr o.add_additional(name, ttl, data) } } return o end |
Instance Method Details
#==(other) ⇒ Object
1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 |
# File 'lib/net/dns/resolv.rb', line 1148 def ==(other) return @id == other.id && @qr == other.qr && @opcode == other.opcode && @aa == other.aa && @tc == other.tc && @rd == other.rd && @ra == other.ra && @rcode == other.rcode && @question == other.question && @answer == other.answer && @authority == other. && @additional == other.additional end |
#add_additional(name, ttl, data) ⇒ Object
1199 1200 1201 |
# File 'lib/net/dns/resolv.rb', line 1199 def add_additional(name, ttl, data) @additional << [Name.create(name), ttl, data] end |
#add_answer(name, ttl, data, cacheflush = false) ⇒ Object
1176 1177 1178 |
# File 'lib/net/dns/resolv.rb', line 1176 def add_answer(name, ttl, data, cacheflush = false) @answer << [Name.create(name), ttl, data, cacheflush] end |
#add_authority(name, ttl, data) ⇒ Object
1189 1190 1191 |
# File 'lib/net/dns/resolv.rb', line 1189 def (name, ttl, data) @authority << [Name.create(name), ttl, data] end |
#add_question(name, typeclass, unicast = false) ⇒ Object
1163 1164 1165 |
# File 'lib/net/dns/resolv.rb', line 1163 def add_question(name, typeclass, unicast = false) @question << [Name.create(name), typeclass, unicast] end |
#each_additional ⇒ Object
1203 1204 1205 1206 1207 |
# File 'lib/net/dns/resolv.rb', line 1203 def each_additional @additional.each {|name, ttl, data| yield name, ttl, data } end |
#each_answer ⇒ Object
Can accept either |name, ttl, data| as block arguments (backwards-compatible/DNS-style), or |name, ttl, data, cacheflush| (mDNS-style).
1183 1184 1185 1186 1187 |
# File 'lib/net/dns/resolv.rb', line 1183 def each_answer # :yields: name, ttl, data, cacheflush @answer.each {|ary| yield ary } end |
#each_authority ⇒ Object
1193 1194 1195 1196 1197 |
# File 'lib/net/dns/resolv.rb', line 1193 def @authority.each {|name, ttl, data| yield name, ttl, data } end |
#each_question ⇒ Object
Can accept either |name, typeclass| as block arguments (backwards-compatible/DNS-style), or |name, typeclass, unicast| (mDNS-style).
1170 1171 1172 1173 1174 |
# File 'lib/net/dns/resolv.rb', line 1170 def each_question # :yields: name, typeclass, unicast @question.each {|ary| yield ary } end |
#each_resource ⇒ Object
1209 1210 1211 1212 1213 |
# File 'lib/net/dns/resolv.rb', line 1209 def each_resource each_answer {|name, ttl, data| yield name, ttl, data} {|name, ttl, data| yield name, ttl, data} each_additional {|name, ttl, data| yield name, ttl, data} end |
#encode ⇒ Object
1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 |
# File 'lib/net/dns/resolv.rb', line 1215 def encode return MessageEncoder.new {|msg| msg.put_pack('nnnnnn', @id, (@qr & 1) << 15 | (@opcode & 15) << 11 | (@aa & 1) << 10 | (@tc & 1) << 9 | (@rd & 1) << 8 | (@ra & 1) << 7 | (@rcode & 15), @question.length, @answer.length, @authority.length, @additional.length) @question.each {|q| name, typeclass, unicast = q hibit = unicast ? (1<<15) : 0x00 msg.put_name(name) msg.put_pack('nn', typeclass::TypeValue, typeclass::ClassValue|hibit) } [@answer, @authority, @additional].each {|rr| rr.each {|r| name, ttl, data, cacheflush = r hibit = cacheflush ? (1<<15) : 0x00 msg.put_name(name) msg.put_pack('nnN', data.class::TypeValue, data.class::ClassValue|hibit, ttl) msg.put_length16 {data.encode_rdata(msg)} } } }.to_s end |
#query? ⇒ Boolean
Returns true if message is a query.
16 17 18 |
# File 'lib/net/dns/resolvx.rb', line 16 def query? qr == 0 end |
#response? ⇒ Boolean
Returns true if message is a response.
21 22 23 |
# File 'lib/net/dns/resolvx.rb', line 21 def response? !query? end |