| Class | Resolv::DNS::Message::MessageDecoder |
| In: |
lib/resolv.rb
|
| Parent: | Object |
# File lib/resolv.rb, line 1251
1251: def initialize(data)
1252: @data = data
1253: @index = 0
1254: @limit = data.length
1255: yield self
1256: end
# File lib/resolv.rb, line 1272
1272: def get_bytes(len = @limit - @index)
1273: d = @data[@index, len]
1274: @index += len
1275: return d
1276: end
# File lib/resolv.rb, line 1343
1343: def get_label
1344: return Label::Str.new(self.get_string)
1345: end
# File lib/resolv.rb, line 1318
1318: def get_labels(limit=nil)
1319: limit = @index if !limit || @index < limit
1320: d = []
1321: while true
1322: case @data[@index]
1323: when 0
1324: @index += 1
1325: return d
1326: when 192..255
1327: idx = self.get_unpack('n')[0] & 0x3fff
1328: if limit <= idx
1329: raise DecodeError.new("non-backward name pointer")
1330: end
1331: save_index = @index
1332: @index = idx
1333: d += self.get_labels(limit)
1334: @index = save_index
1335: return d
1336: else
1337: d << self.get_label
1338: end
1339: end
1340: return d
1341: end
# File lib/resolv.rb, line 1258
1258: def get_length16
1259: len, = self.get_unpack('n')
1260: save_limit = @limit
1261: @limit = @index + len
1262: d = yield(len)
1263: if @index < @limit
1264: raise DecodeError.new("junk exists")
1265: elsif @limit < @index
1266: raise DecodeError.new("limit exceeded")
1267: end
1268: @limit = save_limit
1269: return d
1270: end
# File lib/resolv.rb, line 1347
1347: def get_question
1348: name = self.get_name
1349: type, klass = self.get_unpack("nn")
1350: return name, Resource.get_class(type, klass)
1351: end
# File lib/resolv.rb, line 1353
1353: def get_rr
1354: name = self.get_name
1355: type, klass, ttl = self.get_unpack('nnN')
1356: typeclass = Resource.get_class(type, klass)
1357: return name, ttl, self.get_length16 {typeclass.decode_rdata(self)}
1358: end
# File lib/resolv.rb, line 1298
1298: def get_string
1299: len = @data[@index]
1300: raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
1301: d = @data[@index + 1, len]
1302: @index += 1 + len
1303: return d
1304: end
# File lib/resolv.rb, line 1306
1306: def get_string_list
1307: strings = []
1308: while @index < @limit
1309: strings << self.get_string
1310: end
1311: strings
1312: end
# File lib/resolv.rb, line 1278
1278: def get_unpack(template)
1279: len = 0
1280: template.each_byte {|byte|
1281: case byte
1282: when ?c, ?C
1283: len += 1
1284: when ?n
1285: len += 2
1286: when ?N
1287: len += 4
1288: else
1289: raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
1290: end
1291: }
1292: raise DecodeError.new("limit exceeded") if @limit < @index + len
1293: arr = @data.unpack("@#{@index}#{template}")
1294: @index += len
1295: return arr
1296: end