Class Resolv::DNS::Message::MessageDecoder
In: lib/resolv.rb
Parent: Object

Methods

Public Class methods

[Source]

      # 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

Public Instance methods

[Source]

      # 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

[Source]

      # File lib/resolv.rb, line 1389
1389:         def get_label
1390:           return Label::Str.new(self.get_string)
1391:         end

[Source]

      # 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

[Source]

      # 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

[Source]

      # File lib/resolv.rb, line 1360
1360:         def get_name
1361:           return Name.new(self.get_labels)
1362:         end

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Validate]