Resolv::DNS::Message::MessageDecoder (Class)

In: resolv.rb
Parent: Object

Public Class methods

[Source]

# File resolv.rb, line 1204
        def initialize(data)
          @data = data
          @index = 0
          @limit = data.length
          yield self
        end

Public Instance methods

[Source]

# File resolv.rb, line 1225
        def get_bytes(len = @limit - @index)
          d = @data[@index, len]
          @index += len
          return d
        end

[Source]

# File resolv.rb, line 1288
        def get_label
          return Label::Str.new(self.get_string)
        end

[Source]

# File resolv.rb, line 1263
        def get_labels(limit=nil)
          limit = @index if !limit || @index < limit
          d = []
          while true
            case @data[@index]
            when 0
              @index += 1
              return d
            when 192..255
              idx = self.get_unpack('n')[0] & 0x3fff
              if limit <= idx
                raise DecodeError.new("non-backward name pointer")
              end
              save_index = @index
              @index = idx
              d += self.get_labels(limit)
              @index = save_index
              return d
            else
              d << self.get_label
            end
          end
          return d
        end

[Source]

# File resolv.rb, line 1211
        def get_length16
          len, = self.get_unpack('n')
          save_limit = @limit
          @limit = @index + len
          d = yield(len)
          if @index < @limit
            raise DecodeError.new("junk exists")
          elsif @limit < @index
            raise DecodeError.new("limit exceeded")
          end
          @limit = save_limit
          return d
        end

[Source]

# File resolv.rb, line 1259
        def get_name
          return Name.new(self.get_labels)
        end

[Source]

# File resolv.rb, line 1292
        def get_question
          name = self.get_name
          type, klass = self.get_unpack("nn")
          return name, Resource.get_class(type, klass)
        end

[Source]

# File resolv.rb, line 1298
        def get_rr
          name = self.get_name
          type, klass, ttl = self.get_unpack('nnN')
          typeclass = Resource.get_class(type, klass)
          return name, ttl, self.get_length16 {typeclass.decode_rdata(self)}
        end

[Source]

# File resolv.rb, line 1251
        def get_string
          len = @data[@index]
          raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
          d = @data[@index + 1, len]
          @index += 1 + len
          return d
        end

[Source]

# File resolv.rb, line 1231
        def get_unpack(template)
          len = 0
          template.each_byte {|byte|
            case byte
            when ?c, ?C
              len += 1
            when ?n
              len += 2
            when ?N
              len += 4
            else
              raise StandardError.new("unsupported template: '#{byte.chr}' in '#{template}'")
            end
          }
          raise DecodeError.new("limit exceeded") if @limit < @index + len
          arr = @data.unpack("@#{@index}#{template}")
          @index += len
          return arr
        end

[Validate]