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:



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

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

Instance Method Details

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

Raises:



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

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



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

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

#get_labelsObject



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
1710
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1679

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



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

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



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

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

#get_nameObject



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

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

#get_questionObject



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

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

#get_rrObject



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

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:



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

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



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

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

#get_unpack(template) ⇒ Object

Raises:



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

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



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

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