Class: Gem::Resolv::DNS::Message::MessageDecoder
- Inherits:
-
Object
- Object
- Gem::Resolv::DNS::Message::MessageDecoder
- Defined in:
- lib/rubygems/vendor/resolv/lib/resolv.rb
Overview
:nodoc:
Instance Method Summary collapse
- #get_bytes(len = @limit - @index) ⇒ Object
- #get_label ⇒ Object
- #get_labels ⇒ Object
- #get_length16 ⇒ Object
- #get_list ⇒ Object
- #get_name ⇒ Object
- #get_question ⇒ Object
- #get_rr ⇒ Object
- #get_string ⇒ Object
- #get_string_list ⇒ Object
- #get_unpack(template) ⇒ Object
-
#initialize(data) {|_self| ... } ⇒ MessageDecoder
constructor
A new instance of MessageDecoder.
- #inspect ⇒ Object
Constructor Details
#initialize(data) {|_self| ... } ⇒ MessageDecoder
Returns a new instance of MessageDecoder.
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
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_label ⇒ Object
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_labels ⇒ Object
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_length16 ⇒ Object
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_list ⇒ Object
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_name ⇒ Object
1674 1675 1676 |
# File 'lib/rubygems/vendor/resolv/lib/resolv.rb', line 1674 def get_name return Name.new(self.get_labels) end |
#get_question ⇒ Object
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_rr ⇒ Object
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., e.backtrace end end res.instance_variable_set :@ttl, ttl return name, ttl, res end |
#get_string ⇒ Object
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_list ⇒ Object
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
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 |
#inspect ⇒ Object
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 |