module Mail::Parsers::ReceivedParser

Constants

ReceivedStruct

Attributes

_eof_actions[RW]
_index_offsets[RW]
_indicies[RW]
_key_spans[RW]
_trans_actions[RW]
_trans_keys[RW]
_trans_targs[RW]
en_comment_tail[RW]
en_main[RW]
error[RW]
first_final[RW]
start[RW]

Public Class Methods

parse(data) click to toggle source
# File lib/mail/parsers/received_parser.rb, line 7495
    def self.parse(data)
      data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)

      raise Mail::Field::NilParseError.new(Mail::ReceivedElement) if data.nil?

      # Parser state
      received = ReceivedStruct.new
      received_tokens_s = date_s = time_s = nil

      # 5.1 Variables Used by Ragel
      p = 0
      eof = pe = data.length
      stack = []

      
begin
        p ||= 0
        pe ||= data.length
        cs = start
        top = 0
end

      
begin
        testEof = false
        _slen, _trans, _keys, _inds, _acts, _nacts = nil
        _goto_level = 0
        _resume = 10
        _eof_trans = 15
        _again = 20
        _test_eof = 30
        _out = 40
        while true
        if _goto_level <= 0
        if p == pe
                _goto_level = _test_eof
                next
        end
        if cs == 0
                _goto_level = _out
                next
        end
        end
        if _goto_level <= _resume
        _keys = cs << 1
        _inds = _index_offsets[cs]
        _slen = _key_spans[cs]
        _wide = data[p].ord
        _trans = if (   _slen > 0 && 
                        _trans_keys[_keys] <= _wide && 
                        _wide <= _trans_keys[_keys + 1] 
                    ) then
                        _indicies[ _inds + _wide - _trans_keys[_keys] ] 
                 else 
                        _indicies[ _inds + _slen ]
                 end
        cs = _trans_targs[_trans]
        if _trans_actions[_trans] != 0
        case _trans_actions[_trans]
        when 8 then
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 54 then
                begin
 date_s = p             end
        when 131 then
                begin
 received.time = chars(data, time_s, p-1)               end
        when 9 then
                begin
                end
        when 52 then
                begin
                end
        when 127 then
                begin
                end
        when 68 then
                begin
                end
        when 10 then
                begin
                end
        when 22 then
                begin
                end
        when 64 then
                begin
                end
        when 61 then
                begin
                end
        when 26 then
                begin
                end
        when 24 then
                begin
                end
        when 70 then
                begin
                end
        when 63 then
                begin
                end
        when 47 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 130 then
                begin
        begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
        end
                end
        when 3 then
                begin
 received_tokens_s = p          end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 4 then
                begin
 received_tokens_s = p          end
                begin
                end
        when 5 then
                begin
 received_tokens_s = p          end
                begin
                end
        when 59 then
                begin
 date_s = p             end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 57 then
                begin
 received.date = chars(data, date_s, p-1).strip                 end
                begin
 time_s = p             end
        when 132 then
                begin
 received.time = chars(data, time_s, p-1)               end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 81 then
                begin
                end
                begin
                end
        when 105 then
                begin
                end
                begin
                end
        when 120 then
                begin
                end
                begin
                end
        when 50 then
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 51 then
                begin
                end
                begin
                end
        when 69 then
                begin
                end
                begin
                end
        when 53 then
                begin
                end
                begin
                end
        when 66 then
                begin
                end
                begin
                end
        when 72 then
                begin
                end
                begin
                end
        when 71 then
                begin
                end
                begin
                end
        when 56 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 128 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 129 then
                begin
                end
                begin
        begin
                top -= 1
                cs = stack[top]
                _goto_level = _again
                next
        end
                end
        when 77 then
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 78 then
                begin
                end
                begin
                end
        when 79 then
                begin
                end
                begin
                end
        when 67 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 104 then
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 106 then
                begin
                end
                begin
                end
        when 38 then
                begin
                end
                begin
                end
        when 15 then
                begin
                end
                begin
                end
        when 65 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 6 then
                begin
                end
                begin
                end
        when 60 then
                begin
                end
                begin
                end
        when 25 then
                begin
                end
                begin
                end
        when 116 then
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 117 then
                begin
                end
                begin
                end
        when 118 then
                begin
                end
                begin
                end
        when 73 then
                begin
                end
                begin
                end
        when 55 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
 date_s = p             end
        when 1 then
                begin
 received_tokens_s = p          end
                begin
                end
                begin
                end
        when 21 then
                begin
                end
                begin
                end
                begin
                end
        when 58 then
                begin
                end
                begin
 received.date = chars(data, date_s, p-1).strip                 end
                begin
 time_s = p             end
        when 86 then
                begin
                end
                begin
                end
                begin
                end
        when 111 then
                begin
                end
                begin
                end
                begin
                end
        when 125 then
                begin
                end
                begin
                end
                begin
                end
        when 85 then
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 87 then
                begin
                end
                begin
                end
                begin
                end
        when 110 then
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 112 then
                begin
                end
                begin
                end
                begin
                end
        when 45 then
                begin
                end
                begin
                end
                begin
                end
        when 48 then
                begin
                end
                begin
                end
                begin
                end
        when 124 then
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 126 then
                begin
                end
                begin
                end
                begin
                end
        when 75 then
                begin
                end
                begin
                end
                begin
                end
        when 20 then
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 23 then
                begin
                end
                begin
                end
                begin
                end
        when 101 then
                begin
                end
                begin
                end
                begin
                end
        when 98 then
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 99 then
                begin
                end
                begin
                end
                begin
                end
        when 100 then
                begin
                end
                begin
                end
                begin
                end
        when 31 then
                begin
                end
                begin
                end
                begin
                end
        when 80 then
                begin
                end
                begin
                end
                begin
                end
        when 102 then
                begin
                end
                begin
                end
                begin
                end
        when 119 then
                begin
                end
                begin
                end
                begin
                end
        when 62 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
        when 114 then
                begin
                end
                begin
                end
                begin
                end
        when 74 then
                begin
                end
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
        when 7 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
        when 2 then
                begin
 received_tokens_s = p          end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
        when 37 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 94 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 82 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 93 then
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 95 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 107 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 83 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 108 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 122 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 121 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 49 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
        when 88 then
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 17 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 36 then
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 39 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 13 then
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 14 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 16 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 96 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 18 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 76 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 103 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 115 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 44 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 90 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 43 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 46 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 91 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 84 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 109 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 123 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 113 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 33 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 11 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 29 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
 received.info = chars(data, received_tokens_s, p-1)            end
        when 30 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 32 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 97 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
        when 34 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 19 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 40 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 41 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 92 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 27 then
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 89 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 35 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 12 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 42 then
                begin
                end
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        when 28 then
                begin
        begin
                stack[top] = cs
                top+= 1
                cs = 636
                _goto_level = _again
                next
        end
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
                begin
                end
        end
        end
        end
        if _goto_level <= _again
        if cs == 0
                _goto_level = _out
                next
        end
        p += 1
        if p != pe
                _goto_level = _resume
                next
        end
        end
        if _goto_level <= _test_eof
        if p == eof
          case _eof_actions[cs]
        when 131 then
                begin
 received.time = chars(data, time_s, p-1)               end
        when 52 then
                begin
                end
          end
        end

        end
        if _goto_level <= _out
                break
        end
end
        end


      if p != eof || cs < 648
        raise Mail::Field::IncompleteParseError.new(Mail::ReceivedElement, data, p)
      end

      received
    end