Class: Gem::Resolv::DNS::Message::MessageDecoder

Inherits:
Object
  • Object
show all
Defined in:
lib/rubygems/vendor/resolv/lib/resolv.rb

Overview

:nodoc:

Instance Method Summary collapse

Constructor Details

#initialize(data) {|_self| ... } ⇒ MessageDecoder

Returns a new instance of MessageDecoder.

Yields:

  • (_self)

Yield Parameters:



1596
1597
1598
1599
1600
1601
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1596

def initialize(data)
  @data = data
  @index = 0
  @limit = data.bytesize
  yield self
end

Instance Method Details

#get_bytes(len = @limit - @index) ⇒ Object

Raises:



1621
1622
1623
1624
1625
1626
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1621

def get_bytes(len = @limit - @index)
  raise DecodeError.new("limit exceeded") if @limit < @index + len
  d = @data.byteslice(@index, len)
  @index += len
  return d
end

#get_labelObject



1711
1712
1713
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1711

def get_label
  return Label::Str.new(self.get_string)
end

#get_labelsObject



1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1678

def get_labels
  prev_index = @index
  save_index = nil
  d = []
  size = -1
  while true
    raise DecodeError.new("limit exceeded") if @limit <= @index
    case @data.getbyte(@index)
    when 0
      @index += 1
      if save_index
        @index = save_index
      end
      return d
    when 192..255
      idx = self.get_unpack('n')[0] & 0x3fff
      if prev_index <= idx
        raise DecodeError.new("non-backward name pointer")
      end
      prev_index = idx
      if !save_index
        save_index = @index
      end
      @index = idx
    else
      l = self.get_label
      d << l
      size += 1 + l.string.bytesize
      raise DecodeError.new("name label data exceed 255 octets") if size > 255
    end
  end
end

#get_length16Object



1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1607

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

#get_listObject



1666
1667
1668
1669
1670
1671
1672
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1666

def get_list
  [].tap do |values|
    while @index < @limit
      values << yield
    end
  end
end

#get_nameObject



1674
1675
1676
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1674

def get_name
  return Name.new(self.get_labels)
end

#get_questionObject



1715
1716
1717
1718
1719
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1715

def get_question
  name = self.get_name
  type, klass = self.get_unpack("nn")
  return name, Resource.get_class(type, klass)
end

#get_rrObject



1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1721

def get_rr
  name = self.get_name
  type, klass, ttl = self.get_unpack('nnN')
  typeclass = Resource.get_class(type, klass)
  res = self.get_length16 do
    begin
      typeclass.decode_rdata self
    rescue => e
      raise DecodeError, e.message, e.backtrace
    end
  end
  res.instance_variable_set :@ttl, ttl
  return name, ttl, res
end

#get_stringObject

Raises:



1649
1650
1651
1652
1653
1654
1655
1656
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1649

def get_string
  raise DecodeError.new("limit exceeded") if @limit <= @index
  len = @data.getbyte(@index)
  raise DecodeError.new("limit exceeded") if @limit < @index + 1 + len
  d = @data.byteslice(@index + 1, len)
  @index += 1 + len
  return d
end

#get_string_listObject



1658
1659
1660
1661
1662
1663
1664
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1658

def get_string_list
  strings = []
  while @index < @limit
    strings << self.get_string
  end
  strings
end

#get_unpack(template) ⇒ Object

Raises:



1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1628

def get_unpack(template)
  len = 0
  template.each_byte {|byte|
    byte = "%c" % 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

#inspectObject



1603
1604
1605
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1603

def inspect
  "\#<#{self.class}: #{@data.byteslice(0, @index).inspect} #{@data.byteslice(@index..-1).inspect}>"
end