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

Methods

Public Class methods

[Source]

      # 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

Public Instance methods

[Source]

      # 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

[Source]

      # File lib/resolv.rb, line 1343
1343:         def get_label
1344:           return Label::Str.new(self.get_string)
1345:         end

[Source]

      # 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

[Source]

      # 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

[Source]

      # File lib/resolv.rb, line 1314
1314:         def get_name
1315:           return Name.new(self.get_labels)
1316:         end

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Source]

      # 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

[Validate]