| Class | Resolv::DNS::Message::MessageDecoder |
| In: |
lib/resolv.rb
|
| Parent: | Object |
# File lib/resolv.rb, line 1297
1297: def initialize(data)
1298: @data = data
1299: @index = 0
1300: @limit = data.length
1301: yield self
1302: end
# File lib/resolv.rb, line 1318
1318: def get_bytes(len = @limit - @index)
1319: d = @data[@index, len]
1320: @index += len
1321: return d
1322: end
# File lib/resolv.rb, line 1389
1389: def get_label
1390: return Label::Str.new(self.get_string)
1391: end
# File lib/resolv.rb, line 1364
1364: def get_labels(limit=nil)
1365: limit = @index if !limit || @index < limit
1366: d = []
1367: while true
1368: case @data[@index]
1369: when 0
1370: @index += 1
1371: return d
1372: when 192..255
1373: idx = self.get_unpack('n')[0] & 0x3fff
1374: if limit <= idx
1375: raise DecodeError.new("non-backward name pointer")
1376: end
1377: save_index = @index
1378: @index = idx
1379: d += self.get_labels(limit)
1380: @index = save_index
1381: return d
1382: else
1383: d << self.get_label
1384: end
1385: end
1386: return d
1387: end
# File lib/resolv.rb, line 1304
1304: def get_length16
1305: len, = self.get_unpack('n')
1306: save_limit = @limit
1307: @limit = @index + len
1308: d = yield(len)
1309: if @index < @limit
1310: raise DecodeError.new("junk exists")
1311: elsif @limit < @index
1312: raise DecodeError.new("limit exceeded")
1313: end
1314: @limit = save_limit
1315: return d
1316: end
# File lib/resolv.rb, line 1393
1393: def get_question
1394: name = self.get_name
1395: type, klass = self.get_unpack("nn")
1396: return name, Resource.get_class(type, klass)
1397: end
# File lib/resolv.rb, line 1399
1399: def get_rr
1400: name = self.get_name
1401: type, klass, ttl = self.get_unpack('nnN')
1402: typeclass = Resource.get_class(type, klass)
1403: return name, ttl, self.get_length16 {typeclass.decode_rdata(self)}
1404: end
# File lib/resolv.rb, line 1344
1344: def get_string
1345: len = @data[@index]
1346: raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
1347: d = @data[@index + 1, len]
1348: @index += 1 + len
1349: return d
1350: end
# File lib/resolv.rb, line 1352
1352: def get_string_list
1353: strings = []
1354: while @index < @limit
1355: strings << self.get_string
1356: end
1357: strings
1358: end
# File lib/resolv.rb, line 1324
1324: def get_unpack(template)
1325: len = 0
1326: template.each_byte {|byte|
1327: case byte
1328: when ?c, ?C
1329: len += 1
1330: when ?n
1331: len += 2
1332: when ?N
1333: len += 4
1334: else
1335: raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
1336: end
1337: }
1338: raise DecodeError.new("limit exceeded") if @limit < @index + len
1339: arr = @data.unpack("@#{@index}#{template}")
1340: @index += len
1341: return arr
1342: end