mail 2.6.6 → 2.7.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.rdoc +25 -6
  3. data/Dependencies.txt +0 -1
  4. data/Gemfile +5 -8
  5. data/MIT-LICENSE +1 -1
  6. data/README.md +22 -11
  7. data/Rakefile +0 -6
  8. data/lib/mail.rb +2 -10
  9. data/lib/mail/attachments_list.rb +3 -2
  10. data/lib/mail/body.rb +3 -3
  11. data/lib/mail/core_extensions/smtp.rb +19 -16
  12. data/lib/mail/core_extensions/string.rb +0 -4
  13. data/lib/mail/elements/address.rb +9 -4
  14. data/lib/mail/elements/address_list.rb +10 -18
  15. data/lib/mail/elements/content_disposition_element.rb +8 -15
  16. data/lib/mail/elements/content_location_element.rb +5 -10
  17. data/lib/mail/elements/content_transfer_encoding_element.rb +5 -10
  18. data/lib/mail/elements/content_type_element.rb +8 -19
  19. data/lib/mail/elements/date_time_element.rb +6 -14
  20. data/lib/mail/elements/envelope_from_element.rb +14 -21
  21. data/lib/mail/elements/message_ids_element.rb +8 -12
  22. data/lib/mail/elements/mime_version_element.rb +6 -14
  23. data/lib/mail/elements/phrase_list.rb +6 -9
  24. data/lib/mail/elements/received_element.rb +9 -15
  25. data/lib/mail/encodings.rb +12 -14
  26. data/lib/mail/field.rb +7 -4
  27. data/lib/mail/fields/common/parameter_hash.rb +1 -1
  28. data/lib/mail/fields/content_type_field.rb +2 -7
  29. data/lib/mail/fields/unstructured_field.rb +2 -2
  30. data/lib/mail/header.rb +1 -0
  31. data/lib/mail/message.rb +23 -25
  32. data/lib/mail/multibyte.rb +51 -0
  33. data/lib/mail/multibyte/chars.rb +27 -27
  34. data/lib/mail/network/delivery_methods/exim.rb +10 -6
  35. data/lib/mail/network/delivery_methods/sendmail.rb +2 -6
  36. data/lib/mail/network/delivery_methods/smtp.rb +14 -6
  37. data/lib/mail/parsers.rb +16 -24
  38. data/lib/mail/parsers/address_lists_parser.rb +15321 -112
  39. data/lib/mail/parsers/address_lists_parser.rl +166 -0
  40. data/lib/mail/parsers/content_disposition_parser.rb +698 -55
  41. data/lib/mail/parsers/content_disposition_parser.rl +76 -0
  42. data/lib/mail/parsers/content_location_parser.rb +565 -23
  43. data/lib/mail/parsers/content_location_parser.rl +65 -0
  44. data/lib/mail/parsers/content_transfer_encoding_parser.rb +410 -22
  45. data/lib/mail/parsers/content_transfer_encoding_parser.rl +58 -0
  46. data/lib/mail/parsers/content_type_parser.rb +841 -54
  47. data/lib/mail/parsers/content_type_parser.rl +77 -0
  48. data/lib/mail/parsers/date_time_parser.rb +773 -26
  49. data/lib/mail/parsers/date_time_parser.rl +56 -0
  50. data/lib/mail/parsers/envelope_from_parser.rb +2051 -36
  51. data/lib/mail/parsers/envelope_from_parser.rl +76 -0
  52. data/lib/mail/parsers/message_ids_parser.rb +1494 -25
  53. data/lib/mail/parsers/message_ids_parser.rl +76 -0
  54. data/lib/mail/parsers/mime_version_parser.rb +393 -26
  55. data/lib/mail/parsers/mime_version_parser.rl +55 -0
  56. data/lib/mail/parsers/phrase_lists_parser.rb +529 -19
  57. data/lib/mail/parsers/phrase_lists_parser.rl +77 -0
  58. data/lib/mail/parsers/received_parser.rb +4711 -38
  59. data/lib/mail/parsers/received_parser.rl +78 -0
  60. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +12 -0
  61. data/lib/mail/parsers/rfc2045_content_type.rl +24 -0
  62. data/lib/mail/parsers/rfc2045_mime.rl +15 -0
  63. data/lib/mail/parsers/rfc2183_content_disposition.rl +14 -0
  64. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +16 -0
  65. data/lib/mail/parsers/rfc5322.rl +57 -0
  66. data/lib/mail/parsers/rfc5322_address.rl +70 -0
  67. data/lib/mail/parsers/{ragel/date_time.rl → rfc5322_date_time.rl} +7 -1
  68. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +56 -0
  69. data/lib/mail/part.rb +1 -1
  70. data/lib/mail/parts_list.rb +5 -6
  71. data/lib/mail/utilities.rb +4 -2
  72. data/lib/mail/version.rb +3 -3
  73. data/lib/mail/version_specific/ruby_1_8.rb +28 -2
  74. data/lib/mail/version_specific/ruby_1_9.rb +48 -8
  75. metadata +28 -45
  76. data/lib/mail/core_extensions/string/access.rb +0 -146
  77. data/lib/mail/core_extensions/string/multibyte.rb +0 -79
  78. data/lib/mail/parsers/ragel.rb +0 -18
  79. data/lib/mail/parsers/ragel/common.rl +0 -185
  80. data/lib/mail/parsers/ragel/parser_info.rb +0 -61
  81. data/lib/mail/parsers/ragel/ruby.rb +0 -40
  82. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb +0 -14864
  83. data/lib/mail/parsers/ragel/ruby/machines/address_lists_machine.rb.rl +0 -37
  84. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb +0 -751
  85. data/lib/mail/parsers/ragel/ruby/machines/content_disposition_machine.rb.rl +0 -37
  86. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb +0 -614
  87. data/lib/mail/parsers/ragel/ruby/machines/content_location_machine.rb.rl +0 -37
  88. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb +0 -447
  89. data/lib/mail/parsers/ragel/ruby/machines/content_transfer_encoding_machine.rb.rl +0 -37
  90. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb +0 -825
  91. data/lib/mail/parsers/ragel/ruby/machines/content_type_machine.rb.rl +0 -37
  92. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb +0 -817
  93. data/lib/mail/parsers/ragel/ruby/machines/date_time_machine.rb.rl +0 -37
  94. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb +0 -2149
  95. data/lib/mail/parsers/ragel/ruby/machines/envelope_from_machine.rb.rl +0 -37
  96. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb +0 -1570
  97. data/lib/mail/parsers/ragel/ruby/machines/message_ids_machine.rb.rl +0 -37
  98. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb +0 -440
  99. data/lib/mail/parsers/ragel/ruby/machines/mime_version_machine.rb.rl +0 -37
  100. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb +0 -564
  101. data/lib/mail/parsers/ragel/ruby/machines/phrase_lists_machine.rb.rl +0 -37
  102. data/lib/mail/parsers/ragel/ruby/machines/rb_actions.rl +0 -51
  103. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb +0 -5144
  104. data/lib/mail/parsers/ragel/ruby/machines/received_machine.rb.rl +0 -37
  105. data/lib/mail/parsers/ragel/ruby/parser.rb.rl.erb +0 -37
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+ require 'mail/utilities'
3
+
4
+ %%{
5
+ machine content_transfer_encoding;
6
+
7
+ action encoding_s { encoding_s = p }
8
+ action encoding_e { content_transfer_encoding.encoding = data[encoding_s..(p-1)].downcase }
9
+
10
+ # No-op actions
11
+ action comment_e { }
12
+ action comment_s { }
13
+ action phrase_e { }
14
+ action phrase_s { }
15
+ action qstr_e { }
16
+ action qstr_s { }
17
+ action param_attr_e { }
18
+ action param_attr_s { }
19
+ action param_val_e { }
20
+ action param_val_s { }
21
+ action main_type_e { }
22
+ action main_type_s { }
23
+ action sub_type_e { }
24
+ action sub_type_s { }
25
+
26
+ include rfc2045_content_transfer_encoding "rfc2045_content_transfer_encoding.rl";
27
+ main := content_transfer_encoding;
28
+ }%%
29
+
30
+ module Mail::Parsers
31
+ module ContentTransferEncodingParser
32
+ ContentTransferEncodingStruct = Struct.new(:encoding, :error)
33
+
34
+ %%write data noprefix;
35
+
36
+ def self.parse(data)
37
+ content_transfer_encoding = ContentTransferEncodingStruct.new('')
38
+ return content_transfer_encoding if Mail::Utilities.blank?(data)
39
+
40
+ # Parser state
41
+ encoding_s = nil
42
+
43
+ # 5.1 Variables Used by Ragel
44
+ p = 0
45
+ eof = pe = data.length
46
+ stack = []
47
+
48
+ %%write init;
49
+ %%write exec;
50
+
51
+ if p != eof || cs < %%{ write first_final; }%%
52
+ raise Mail::Field::ParseError.new(Mail::ContentTransferEncodingElement, data, "Only able to parse up to #{data[0..p]}")
53
+ end
54
+
55
+ content_transfer_encoding
56
+ end
57
+ end
58
+ end
@@ -1,66 +1,853 @@
1
+
1
2
  # frozen_string_literal: true
3
+ require 'mail/utilities'
4
+
5
+
6
+
7
+
2
8
  module Mail::Parsers
3
- class ContentTypeParser
4
- include Mail::Utilities
9
+ module ContentTypeParser
10
+ ContentTypeStruct = Struct.new(:main_type, :sub_type, :parameters, :error)
5
11
 
6
- def parse(s)
7
- actions, error = Ragel.parse(:content_type, s)
8
- if error
9
- raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, error)
10
- end
12
+
13
+ class << self
14
+ attr_accessor :_trans_keys
15
+ private :_trans_keys, :_trans_keys=
16
+ end
17
+ self._trans_keys = [
18
+ 0, 0, 33, 126, 33, 126,
19
+ 33, 126, 9, 126, 10,
20
+ 10, 9, 32, 33, 126,
21
+ 9, 126, 9, 40, 10, 10,
22
+ 9, 32, 1, 127, 1,
23
+ 127, 10, 10, 9, 32,
24
+ 10, 10, 9, 32, 9, 126,
25
+ 9, 126, 10, 10, 9,
26
+ 32, 9, 126, 0, 127,
27
+ 9, 40, 10, 10, 9, 32,
28
+ 9, 126, 1, 127, 1,
29
+ 127, 10, 10, 9, 32,
30
+ -128, -1, 9, 126, 9, 59,
31
+ 9, 126, 9, 126, 9,
32
+ 126, 9, 126, 9, 126,
33
+ 0, 0, 0
34
+ ]
35
+
36
+ class << self
37
+ attr_accessor :_key_spans
38
+ private :_key_spans, :_key_spans=
39
+ end
40
+ self._key_spans = [
41
+ 0, 94, 94, 94, 118, 1, 24, 94,
42
+ 118, 32, 1, 24, 127, 127, 1, 24,
43
+ 1, 24, 118, 118, 1, 24, 118, 128,
44
+ 32, 1, 24, 118, 127, 127, 1, 24,
45
+ 128, 118, 51, 118, 118, 118, 118, 118,
46
+ 0
47
+ ]
48
+
49
+ class << self
50
+ attr_accessor :_index_offsets
51
+ private :_index_offsets, :_index_offsets=
52
+ end
53
+ self._index_offsets = [
54
+ 0, 0, 95, 190, 285, 404, 406, 431,
55
+ 526, 645, 678, 680, 705, 833, 961, 963,
56
+ 988, 990, 1015, 1134, 1253, 1255, 1280, 1399,
57
+ 1528, 1561, 1563, 1588, 1707, 1835, 1963, 1965,
58
+ 1990, 2119, 2238, 2290, 2409, 2528, 2647, 2766,
59
+ 2885
60
+ ]
61
+
62
+ class << self
63
+ attr_accessor :_indicies
64
+ private :_indicies, :_indicies=
65
+ end
66
+ self._indicies = [
67
+ 0, 0, 0, 0, 0, 0, 0, 1,
68
+ 1, 0, 0, 0, 0, 0, 1, 0,
69
+ 0, 0, 0, 0, 0, 0, 0, 0,
70
+ 0, 1, 1, 1, 1, 1, 1, 1,
71
+ 0, 0, 0, 0, 0, 0, 0, 0,
72
+ 0, 0, 0, 0, 0, 0, 0, 0,
73
+ 0, 0, 0, 0, 0, 0, 0, 0,
74
+ 0, 0, 1, 1, 1, 0, 0, 0,
75
+ 0, 0, 0, 0, 0, 0, 0, 0,
76
+ 0, 0, 0, 0, 0, 0, 0, 0,
77
+ 0, 0, 0, 0, 0, 0, 0, 0,
78
+ 0, 0, 0, 0, 0, 0, 1, 2,
79
+ 2, 2, 2, 2, 2, 2, 1, 1,
80
+ 2, 2, 2, 2, 2, 3, 2, 2,
81
+ 2, 2, 2, 2, 2, 2, 2, 2,
82
+ 1, 1, 1, 1, 1, 1, 1, 2,
83
+ 2, 2, 2, 2, 2, 2, 2, 2,
84
+ 2, 2, 2, 2, 2, 2, 2, 2,
85
+ 2, 2, 2, 2, 2, 2, 2, 2,
86
+ 2, 1, 1, 1, 2, 2, 2, 2,
87
+ 2, 2, 2, 2, 2, 2, 2, 2,
88
+ 2, 2, 2, 2, 2, 2, 2, 2,
89
+ 2, 2, 2, 2, 2, 2, 2, 2,
90
+ 2, 2, 2, 2, 2, 1, 4, 4,
91
+ 4, 4, 4, 4, 4, 1, 1, 4,
92
+ 4, 4, 4, 4, 1, 4, 4, 4,
93
+ 4, 4, 4, 4, 4, 4, 4, 1,
94
+ 1, 1, 1, 1, 1, 1, 4, 4,
95
+ 4, 4, 4, 4, 4, 4, 4, 4,
96
+ 4, 4, 4, 4, 4, 4, 4, 4,
97
+ 4, 4, 4, 4, 4, 4, 4, 4,
98
+ 1, 1, 1, 4, 4, 4, 4, 4,
99
+ 4, 4, 4, 4, 4, 4, 4, 4,
100
+ 4, 4, 4, 4, 4, 4, 4, 4,
101
+ 4, 4, 4, 4, 4, 4, 4, 4,
102
+ 4, 4, 4, 4, 1, 5, 1, 1,
103
+ 1, 6, 1, 1, 1, 1, 1, 1,
104
+ 1, 1, 1, 1, 1, 1, 1, 1,
105
+ 1, 1, 1, 1, 5, 7, 7, 7,
106
+ 7, 7, 7, 7, 8, 1, 7, 7,
107
+ 7, 7, 7, 1, 7, 7, 7, 7,
108
+ 7, 7, 7, 7, 7, 7, 1, 9,
109
+ 1, 1, 1, 1, 1, 7, 7, 7,
110
+ 7, 7, 7, 7, 7, 7, 7, 7,
111
+ 7, 7, 7, 7, 7, 7, 7, 7,
112
+ 7, 7, 7, 7, 7, 7, 7, 1,
113
+ 1, 1, 7, 7, 7, 7, 7, 7,
114
+ 7, 7, 7, 7, 7, 7, 7, 7,
115
+ 7, 7, 7, 7, 7, 7, 7, 7,
116
+ 7, 7, 7, 7, 7, 7, 7, 7,
117
+ 7, 7, 7, 1, 10, 1, 5, 1,
118
+ 1, 1, 1, 1, 1, 1, 1, 1,
119
+ 1, 1, 1, 1, 1, 1, 1, 1,
120
+ 1, 1, 1, 1, 1, 5, 1, 11,
121
+ 11, 11, 11, 11, 11, 11, 1, 1,
122
+ 11, 11, 11, 11, 11, 1, 11, 11,
123
+ 11, 11, 11, 11, 11, 11, 11, 11,
124
+ 1, 1, 1, 12, 1, 1, 1, 11,
125
+ 11, 11, 11, 11, 11, 11, 11, 11,
126
+ 11, 11, 11, 11, 11, 11, 11, 11,
127
+ 11, 11, 11, 11, 11, 11, 11, 11,
128
+ 11, 1, 1, 1, 11, 11, 11, 11,
129
+ 11, 11, 11, 11, 11, 11, 11, 11,
130
+ 11, 11, 11, 11, 11, 11, 11, 11,
131
+ 11, 11, 11, 11, 11, 11, 11, 11,
132
+ 11, 11, 11, 11, 11, 1, 13, 1,
133
+ 1, 1, 14, 1, 1, 1, 1, 1,
134
+ 1, 1, 1, 1, 1, 1, 1, 1,
135
+ 1, 1, 1, 1, 1, 13, 15, 16,
136
+ 15, 15, 15, 15, 15, 17, 1, 15,
137
+ 15, 15, 15, 15, 1, 15, 15, 15,
138
+ 15, 15, 15, 15, 15, 15, 15, 1,
139
+ 1, 1, 15, 1, 1, 1, 15, 15,
140
+ 15, 15, 15, 15, 15, 15, 15, 15,
141
+ 15, 15, 15, 15, 15, 15, 15, 15,
142
+ 15, 15, 15, 15, 15, 15, 15, 15,
143
+ 1, 1, 1, 15, 15, 15, 15, 15,
144
+ 15, 15, 15, 15, 15, 15, 15, 15,
145
+ 15, 15, 15, 15, 15, 15, 15, 15,
146
+ 15, 15, 15, 15, 15, 15, 15, 15,
147
+ 15, 15, 15, 15, 1, 18, 1, 1,
148
+ 1, 19, 1, 1, 1, 1, 1, 1,
149
+ 1, 1, 1, 1, 1, 1, 1, 1,
150
+ 1, 1, 1, 1, 18, 1, 20, 1,
151
+ 1, 1, 1, 1, 21, 1, 22, 1,
152
+ 18, 1, 1, 1, 1, 1, 1, 1,
153
+ 1, 1, 1, 1, 1, 1, 1, 1,
154
+ 1, 1, 1, 1, 1, 1, 1, 18,
155
+ 1, 23, 23, 23, 23, 23, 23, 23,
156
+ 23, 23, 1, 23, 23, 24, 23, 23,
157
+ 23, 23, 23, 23, 23, 23, 23, 23,
158
+ 23, 23, 23, 23, 23, 23, 23, 23,
159
+ 23, 23, 25, 23, 23, 23, 23, 23,
160
+ 23, 23, 23, 23, 23, 23, 23, 23,
161
+ 23, 23, 23, 23, 23, 23, 23, 23,
162
+ 23, 23, 23, 23, 23, 23, 23, 23,
163
+ 23, 23, 23, 23, 23, 23, 23, 23,
164
+ 23, 23, 23, 23, 23, 23, 23, 23,
165
+ 23, 23, 23, 23, 23, 23, 23, 23,
166
+ 23, 23, 23, 23, 26, 23, 23, 23,
167
+ 23, 23, 23, 23, 23, 23, 23, 23,
168
+ 23, 23, 23, 23, 23, 23, 23, 23,
169
+ 23, 23, 23, 23, 23, 23, 23, 23,
170
+ 23, 23, 23, 23, 23, 23, 23, 23,
171
+ 1, 27, 27, 27, 27, 27, 27, 27,
172
+ 27, 27, 1, 27, 27, 28, 27, 27,
173
+ 27, 27, 27, 27, 27, 27, 27, 27,
174
+ 27, 27, 27, 27, 27, 27, 27, 27,
175
+ 27, 27, 29, 27, 27, 27, 27, 27,
176
+ 27, 27, 27, 27, 27, 27, 27, 27,
177
+ 27, 27, 27, 27, 27, 27, 27, 27,
178
+ 27, 27, 27, 27, 27, 27, 27, 27,
179
+ 27, 27, 27, 27, 27, 27, 27, 27,
180
+ 27, 27, 27, 27, 27, 27, 27, 27,
181
+ 27, 27, 27, 27, 27, 27, 27, 27,
182
+ 27, 27, 27, 27, 30, 27, 27, 27,
183
+ 27, 27, 27, 27, 27, 27, 27, 27,
184
+ 27, 27, 27, 27, 27, 27, 27, 27,
185
+ 27, 27, 27, 27, 27, 27, 27, 27,
186
+ 27, 27, 27, 27, 27, 27, 27, 27,
187
+ 1, 31, 1, 27, 1, 1, 1, 1,
188
+ 1, 1, 1, 1, 1, 1, 1, 1,
189
+ 1, 1, 1, 1, 1, 1, 1, 1,
190
+ 1, 1, 27, 1, 32, 1, 33, 1,
191
+ 1, 1, 1, 1, 1, 1, 1, 1,
192
+ 1, 1, 1, 1, 1, 1, 1, 1,
193
+ 1, 1, 1, 1, 1, 33, 1, 34,
194
+ 1, 1, 1, 35, 1, 1, 1, 1,
195
+ 1, 1, 1, 1, 1, 1, 1, 1,
196
+ 1, 1, 1, 1, 1, 1, 34, 7,
197
+ 7, 7, 7, 7, 7, 7, 36, 1,
198
+ 7, 7, 7, 7, 7, 1, 7, 7,
199
+ 7, 7, 7, 7, 7, 7, 7, 7,
200
+ 1, 9, 1, 1, 1, 1, 1, 7,
201
+ 7, 7, 7, 7, 7, 7, 7, 7,
202
+ 7, 7, 7, 7, 7, 7, 7, 7,
203
+ 7, 7, 7, 7, 7, 7, 7, 7,
204
+ 7, 1, 1, 1, 7, 7, 7, 7,
205
+ 7, 7, 7, 7, 7, 7, 7, 7,
206
+ 7, 7, 7, 7, 7, 7, 7, 7,
207
+ 7, 7, 7, 7, 7, 7, 7, 7,
208
+ 7, 7, 7, 7, 7, 1, 34, 1,
209
+ 1, 1, 35, 1, 1, 1, 1, 1,
210
+ 1, 1, 1, 1, 1, 1, 1, 1,
211
+ 1, 1, 1, 1, 1, 34, 7, 7,
212
+ 7, 7, 7, 7, 7, 36, 1, 7,
213
+ 7, 7, 7, 7, 1, 7, 7, 7,
214
+ 7, 7, 7, 7, 7, 7, 7, 1,
215
+ 1, 1, 1, 1, 1, 1, 7, 7,
216
+ 7, 7, 7, 7, 7, 7, 7, 7,
217
+ 7, 7, 7, 7, 7, 7, 7, 7,
218
+ 7, 7, 7, 7, 7, 7, 7, 7,
219
+ 1, 1, 1, 7, 7, 7, 7, 7,
220
+ 7, 7, 7, 7, 7, 7, 7, 7,
221
+ 7, 7, 7, 7, 7, 7, 7, 7,
222
+ 7, 7, 7, 7, 7, 7, 7, 7,
223
+ 7, 7, 7, 7, 1, 37, 1, 34,
224
+ 1, 1, 1, 1, 1, 1, 1, 1,
225
+ 1, 1, 1, 1, 1, 1, 1, 1,
226
+ 1, 1, 1, 1, 1, 1, 34, 1,
227
+ 38, 1, 1, 1, 39, 1, 1, 1,
228
+ 1, 1, 1, 1, 1, 1, 1, 1,
229
+ 1, 1, 1, 1, 1, 1, 1, 38,
230
+ 40, 40, 40, 40, 40, 40, 40, 41,
231
+ 1, 40, 40, 40, 40, 40, 1, 40,
232
+ 40, 40, 40, 40, 40, 40, 40, 40,
233
+ 40, 1, 1, 1, 1, 1, 1, 1,
234
+ 40, 40, 40, 40, 40, 40, 40, 40,
235
+ 40, 40, 40, 40, 40, 40, 40, 40,
236
+ 40, 40, 40, 40, 40, 40, 40, 40,
237
+ 40, 40, 1, 1, 1, 40, 40, 40,
238
+ 40, 40, 40, 40, 40, 40, 40, 40,
239
+ 40, 40, 40, 40, 40, 40, 40, 40,
240
+ 40, 40, 40, 40, 40, 40, 40, 40,
241
+ 40, 40, 40, 40, 40, 40, 1, 27,
242
+ 27, 27, 27, 27, 27, 27, 27, 27,
243
+ 27, 27, 27, 27, 27, 27, 27, 27,
244
+ 27, 27, 27, 27, 27, 27, 27, 27,
245
+ 27, 27, 27, 27, 27, 27, 27, 27,
246
+ 27, 27, 27, 27, 27, 27, 27, 27,
247
+ 27, 27, 27, 27, 27, 27, 27, 27,
248
+ 27, 27, 27, 27, 27, 27, 27, 27,
249
+ 27, 27, 27, 27, 27, 27, 27, 27,
250
+ 27, 27, 27, 27, 27, 27, 27, 27,
251
+ 27, 27, 27, 27, 27, 27, 27, 27,
252
+ 27, 27, 27, 27, 27, 27, 27, 27,
253
+ 27, 27, 27, 27, 27, 27, 27, 27,
254
+ 27, 27, 27, 27, 27, 27, 27, 27,
255
+ 27, 27, 27, 27, 27, 27, 27, 27,
256
+ 27, 27, 27, 27, 27, 27, 27, 27,
257
+ 27, 27, 27, 27, 27, 27, 27, 1,
258
+ 42, 1, 1, 1, 43, 1, 1, 1,
259
+ 1, 1, 1, 1, 1, 1, 1, 1,
260
+ 1, 1, 1, 1, 1, 1, 1, 42,
261
+ 1, 44, 1, 1, 1, 1, 1, 45,
262
+ 1, 46, 1, 47, 1, 1, 1, 1,
263
+ 1, 1, 1, 1, 1, 1, 1, 1,
264
+ 1, 1, 1, 1, 1, 1, 1, 1,
265
+ 1, 1, 47, 1, 48, 1, 1, 1,
266
+ 49, 1, 1, 1, 1, 1, 1, 1,
267
+ 1, 1, 1, 1, 1, 1, 1, 1,
268
+ 1, 1, 1, 48, 40, 40, 40, 40,
269
+ 40, 40, 40, 50, 1, 40, 40, 40,
270
+ 40, 40, 1, 40, 40, 40, 40, 40,
271
+ 40, 40, 40, 40, 40, 1, 51, 1,
272
+ 1, 1, 1, 1, 40, 40, 40, 40,
273
+ 40, 40, 40, 40, 40, 40, 40, 40,
274
+ 40, 40, 40, 40, 40, 40, 40, 40,
275
+ 40, 40, 40, 40, 40, 40, 1, 1,
276
+ 1, 40, 40, 40, 40, 40, 40, 40,
277
+ 40, 40, 40, 40, 40, 40, 40, 40,
278
+ 40, 40, 40, 40, 40, 40, 40, 40,
279
+ 40, 40, 40, 40, 40, 40, 40, 40,
280
+ 40, 40, 1, 52, 52, 52, 52, 52,
281
+ 52, 52, 52, 52, 1, 52, 52, 53,
282
+ 52, 52, 52, 52, 52, 52, 52, 52,
283
+ 52, 52, 52, 52, 52, 52, 52, 52,
284
+ 52, 52, 52, 52, 52, 52, 52, 52,
285
+ 52, 52, 54, 55, 52, 52, 52, 52,
286
+ 52, 52, 52, 52, 52, 52, 52, 52,
287
+ 52, 52, 52, 52, 52, 52, 52, 52,
288
+ 52, 52, 52, 52, 52, 52, 52, 52,
289
+ 52, 52, 52, 52, 52, 52, 52, 52,
290
+ 52, 52, 52, 52, 52, 52, 52, 52,
291
+ 52, 52, 52, 52, 52, 52, 56, 52,
292
+ 52, 52, 52, 52, 52, 52, 52, 52,
293
+ 52, 52, 52, 52, 52, 52, 52, 52,
294
+ 52, 52, 52, 52, 52, 52, 52, 52,
295
+ 52, 52, 52, 52, 52, 52, 52, 52,
296
+ 52, 52, 1, 57, 57, 57, 57, 57,
297
+ 57, 57, 57, 57, 1, 57, 57, 58,
298
+ 57, 57, 57, 57, 57, 57, 57, 57,
299
+ 57, 57, 57, 57, 57, 57, 57, 57,
300
+ 57, 57, 57, 57, 57, 57, 57, 57,
301
+ 57, 57, 59, 60, 57, 57, 57, 57,
302
+ 57, 57, 57, 57, 57, 57, 57, 57,
303
+ 57, 57, 57, 57, 57, 57, 57, 57,
304
+ 57, 57, 57, 57, 57, 57, 57, 57,
305
+ 57, 57, 57, 57, 57, 57, 57, 57,
306
+ 57, 57, 57, 57, 57, 57, 57, 57,
307
+ 57, 57, 57, 57, 57, 57, 61, 57,
308
+ 57, 57, 57, 57, 57, 57, 57, 57,
309
+ 57, 57, 57, 57, 57, 57, 57, 57,
310
+ 57, 57, 57, 57, 57, 57, 57, 57,
311
+ 57, 57, 57, 57, 57, 57, 57, 57,
312
+ 57, 57, 1, 62, 1, 57, 1, 1,
313
+ 1, 1, 1, 1, 1, 1, 1, 1,
314
+ 1, 1, 1, 1, 1, 1, 1, 1,
315
+ 1, 1, 1, 1, 57, 1, 1, 1,
316
+ 1, 1, 1, 1, 1, 1, 1, 1,
317
+ 1, 1, 1, 1, 1, 1, 1, 1,
318
+ 1, 1, 1, 1, 1, 1, 1, 1,
319
+ 1, 1, 1, 1, 1, 1, 1, 1,
320
+ 1, 1, 1, 1, 1, 1, 1, 1,
321
+ 1, 1, 1, 1, 1, 1, 1, 1,
322
+ 1, 1, 1, 1, 1, 1, 1, 1,
323
+ 1, 1, 1, 1, 1, 1, 1, 1,
324
+ 1, 1, 1, 1, 1, 1, 1, 1,
325
+ 1, 1, 1, 1, 1, 1, 1, 1,
326
+ 1, 1, 1, 1, 1, 1, 1, 1,
327
+ 1, 1, 1, 1, 1, 1, 1, 1,
328
+ 1, 1, 1, 1, 1, 1, 1, 1,
329
+ 1, 1, 1, 1, 1, 1, 1, 1,
330
+ 1, 1, 1, 1, 1, 1, 1, 1,
331
+ 1, 1, 1, 1, 1, 1, 57, 63,
332
+ 1, 1, 1, 64, 1, 1, 1, 1,
333
+ 1, 1, 1, 1, 1, 1, 1, 1,
334
+ 1, 1, 1, 1, 1, 1, 63, 65,
335
+ 65, 65, 65, 65, 65, 65, 66, 1,
336
+ 65, 65, 65, 65, 65, 1, 65, 65,
337
+ 65, 65, 65, 65, 65, 65, 65, 65,
338
+ 1, 67, 1, 1, 1, 1, 1, 65,
339
+ 65, 65, 65, 65, 65, 65, 65, 65,
340
+ 65, 65, 65, 65, 65, 65, 65, 65,
341
+ 65, 65, 65, 65, 65, 65, 65, 65,
342
+ 65, 1, 1, 1, 65, 65, 65, 65,
343
+ 65, 65, 65, 65, 65, 65, 65, 65,
344
+ 65, 65, 65, 65, 65, 65, 65, 65,
345
+ 65, 65, 65, 65, 65, 65, 65, 65,
346
+ 65, 65, 65, 65, 65, 1, 68, 1,
347
+ 1, 1, 69, 1, 1, 1, 1, 1,
348
+ 1, 1, 1, 1, 1, 1, 1, 1,
349
+ 1, 1, 1, 1, 1, 68, 1, 1,
350
+ 1, 1, 1, 1, 1, 70, 1, 1,
351
+ 1, 1, 1, 1, 1, 1, 1, 1,
352
+ 1, 1, 1, 1, 1, 1, 1, 1,
353
+ 71, 1, 68, 1, 1, 1, 69, 1,
354
+ 1, 1, 1, 1, 1, 1, 1, 1,
355
+ 1, 1, 1, 1, 1, 1, 1, 1,
356
+ 1, 68, 7, 7, 7, 7, 7, 7,
357
+ 7, 70, 1, 7, 7, 7, 7, 7,
358
+ 1, 7, 7, 7, 7, 7, 7, 7,
359
+ 7, 7, 7, 1, 71, 1, 1, 1,
360
+ 1, 1, 7, 7, 7, 7, 7, 7,
361
+ 7, 7, 7, 7, 7, 7, 7, 7,
362
+ 7, 7, 7, 7, 7, 7, 7, 7,
363
+ 7, 7, 7, 7, 1, 1, 1, 7,
364
+ 7, 7, 7, 7, 7, 7, 7, 7,
365
+ 7, 7, 7, 7, 7, 7, 7, 7,
366
+ 7, 7, 7, 7, 7, 7, 7, 7,
367
+ 7, 7, 7, 7, 7, 7, 7, 7,
368
+ 1, 72, 1, 1, 1, 73, 1, 1,
369
+ 1, 1, 1, 1, 1, 1, 1, 1,
370
+ 1, 1, 1, 1, 1, 1, 1, 1,
371
+ 72, 40, 40, 40, 40, 40, 40, 40,
372
+ 74, 1, 40, 40, 40, 40, 40, 1,
373
+ 40, 40, 40, 40, 40, 40, 40, 40,
374
+ 40, 40, 1, 75, 1, 1, 1, 1,
375
+ 1, 40, 40, 40, 40, 40, 40, 40,
376
+ 40, 40, 40, 40, 40, 40, 40, 40,
377
+ 40, 40, 40, 40, 40, 40, 40, 40,
378
+ 40, 40, 40, 1, 1, 1, 40, 40,
379
+ 40, 40, 40, 40, 40, 40, 40, 40,
380
+ 40, 40, 40, 40, 40, 40, 40, 40,
381
+ 40, 40, 40, 40, 40, 40, 40, 40,
382
+ 40, 40, 40, 40, 40, 40, 40, 1,
383
+ 76, 1, 1, 1, 77, 1, 1, 1,
384
+ 1, 1, 1, 1, 1, 1, 1, 1,
385
+ 1, 1, 1, 1, 1, 1, 1, 76,
386
+ 78, 1, 78, 78, 78, 78, 78, 79,
387
+ 1, 78, 78, 78, 78, 78, 1, 78,
388
+ 78, 78, 78, 78, 78, 78, 78, 78,
389
+ 78, 1, 71, 1, 78, 1, 1, 1,
390
+ 78, 78, 78, 78, 78, 78, 78, 78,
391
+ 78, 78, 78, 78, 78, 78, 78, 78,
392
+ 78, 78, 78, 78, 78, 78, 78, 78,
393
+ 78, 78, 1, 1, 1, 78, 78, 78,
394
+ 78, 78, 78, 78, 78, 78, 78, 78,
395
+ 78, 78, 78, 78, 78, 78, 78, 78,
396
+ 78, 78, 78, 78, 78, 78, 78, 78,
397
+ 78, 78, 78, 78, 78, 78, 1, 47,
398
+ 1, 1, 1, 80, 1, 1, 1, 1,
399
+ 1, 1, 1, 1, 1, 1, 1, 1,
400
+ 1, 1, 1, 1, 1, 1, 47, 7,
401
+ 7, 7, 7, 7, 7, 7, 81, 1,
402
+ 7, 7, 7, 7, 7, 1, 7, 7,
403
+ 7, 7, 7, 7, 7, 7, 7, 7,
404
+ 1, 9, 1, 1, 1, 1, 1, 7,
405
+ 7, 7, 7, 7, 7, 7, 7, 7,
406
+ 7, 7, 7, 7, 7, 7, 7, 7,
407
+ 7, 7, 7, 7, 7, 7, 7, 7,
408
+ 7, 1, 1, 1, 7, 7, 7, 7,
409
+ 7, 7, 7, 7, 7, 7, 7, 7,
410
+ 7, 7, 7, 7, 7, 7, 7, 7,
411
+ 7, 7, 7, 7, 7, 7, 7, 7,
412
+ 7, 7, 7, 7, 7, 1, 82, 1,
413
+ 1, 1, 83, 1, 1, 1, 1, 1,
414
+ 1, 1, 1, 1, 1, 1, 1, 1,
415
+ 1, 1, 1, 1, 1, 82, 40, 40,
416
+ 40, 40, 40, 40, 40, 84, 1, 40,
417
+ 40, 40, 40, 40, 1, 40, 40, 40,
418
+ 40, 40, 40, 40, 40, 40, 40, 1,
419
+ 51, 1, 1, 1, 1, 1, 40, 40,
420
+ 40, 40, 40, 40, 40, 40, 40, 40,
421
+ 40, 40, 40, 40, 40, 40, 40, 40,
422
+ 40, 40, 40, 40, 40, 40, 40, 40,
423
+ 1, 1, 1, 40, 40, 40, 40, 40,
424
+ 40, 40, 40, 40, 40, 40, 40, 40,
425
+ 40, 40, 40, 40, 40, 40, 40, 40,
426
+ 40, 40, 40, 40, 40, 40, 40, 40,
427
+ 40, 40, 40, 40, 1, 1, 0
428
+ ]
429
+
430
+ class << self
431
+ attr_accessor :_trans_targs
432
+ private :_trans_targs, :_trans_targs=
433
+ end
434
+ self._trans_targs = [
435
+ 2, 0, 2, 3, 33, 4, 5, 7,
436
+ 27, 18, 6, 7, 8, 9, 10, 37,
437
+ 12, 24, 9, 10, 12, 24, 11, 13,
438
+ 14, 34, 23, 13, 14, 34, 23, 15,
439
+ 17, 35, 19, 20, 22, 21, 19, 20,
440
+ 7, 22, 9, 10, 12, 24, 26, 38,
441
+ 4, 5, 27, 18, 29, 30, 29, 40,
442
+ 32, 29, 30, 29, 40, 32, 31, 4,
443
+ 5, 33, 27, 18, 35, 16, 36, 18,
444
+ 35, 16, 36, 18, 38, 25, 37, 39,
445
+ 25, 39, 38, 25, 39
446
+ ]
447
+
448
+ class << self
449
+ attr_accessor :_trans_actions
450
+ private :_trans_actions, :_trans_actions=
451
+ end
452
+ self._trans_actions = [
453
+ 1, 0, 0, 2, 3, 0, 0, 4,
454
+ 5, 0, 0, 0, 6, 7, 7, 7,
455
+ 7, 8, 0, 0, 0, 5, 0, 9,
456
+ 9, 10, 9, 0, 0, 11, 0, 0,
457
+ 0, 0, 0, 0, 5, 0, 12, 12,
458
+ 13, 14, 12, 12, 12, 14, 0, 0,
459
+ 12, 12, 14, 12, 15, 15, 16, 17,
460
+ 15, 0, 0, 5, 18, 0, 0, 19,
461
+ 19, 0, 20, 19, 21, 21, 22, 21,
462
+ 23, 23, 24, 23, 21, 21, 0, 25,
463
+ 0, 5, 12, 12, 14
464
+ ]
465
+
466
+ class << self
467
+ attr_accessor :_eof_actions
468
+ private :_eof_actions, :_eof_actions=
469
+ end
470
+ self._eof_actions = [
471
+ 0, 0, 0, 0, 0, 0, 0, 0,
472
+ 0, 0, 0, 0, 0, 0, 0, 0,
473
+ 0, 0, 0, 0, 0, 0, 0, 0,
474
+ 0, 0, 0, 0, 0, 0, 0, 0,
475
+ 0, 19, 21, 21, 23, 21, 0, 12,
476
+ 0
477
+ ]
478
+
479
+ class << self
480
+ attr_accessor :start
481
+ end
482
+ self.start = 1;
483
+ class << self
484
+ attr_accessor :first_final
485
+ end
486
+ self.first_final = 33;
487
+ class << self
488
+ attr_accessor :error
489
+ end
490
+ self.error = 0;
491
+
492
+ class << self
493
+ attr_accessor :en_comment_tail
494
+ end
495
+ self.en_comment_tail = 28;
496
+ class << self
497
+ attr_accessor :en_main
498
+ end
499
+ self.en_main = 1;
11
500
 
12
- content_type = ContentTypeStruct.new(nil,nil,[])
13
501
 
14
- content_type.parameters = []
15
502
 
503
+ def self.parse(data)
504
+ return ContentTypeStruct.new('text', 'plain', []) if Mail::Utilities.blank?(data)
505
+ content_type = ContentTypeStruct.new(nil, nil, [])
506
+
507
+ # Parser state
16
508
  main_type_s = sub_type_s = param_attr_s = param_attr = nil
17
509
  qstr_s = qstr = param_val_s = nil
18
- actions.each_slice(2) do |action_id, p|
19
- action = Mail::Parsers::Ragel::ACTIONS[action_id]
20
- case action
21
-
22
- # Main Type
23
- when :main_type_s then main_type_s = p
24
- when :main_type_e then
25
- content_type.main_type = s[main_type_s..(p-1)]
26
- content_type.main_type.downcase!
27
-
28
- # Sub Type
29
- when :sub_type_s then sub_type_s = p
30
- when :sub_type_e
31
- content_type.sub_type = s[sub_type_s..(p-1)]
32
- content_type.sub_type.downcase!
33
-
34
- # Parameter Attribute
35
- when :param_attr_s then param_attr_s = p
36
- when :param_attr_e then param_attr = s[param_attr_s..(p-1)]
37
-
38
- # Quoted String.
39
- when :qstr_s then qstr_s = p
40
- when :qstr_e then qstr = s[qstr_s..(p-1)]
41
-
42
- # Parameter Value
43
- when :param_val_s then param_val_s = p
44
- when :param_val_e
45
- if param_attr.nil?
46
- raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "no attribute for value")
47
- end
48
-
49
- # Use quoted s value if one exists, otherwise use parameter value
50
- if qstr
51
- value = qstr
52
- else
53
- value = s[param_val_s..(p-1)]
54
- end
55
-
56
- content_type.parameters << { param_attr => value }
57
- param_attr = nil
58
- qstr = nil
59
-
60
- else
61
- raise Mail::Field::ParseError.new(Mail::ContentTypeElement, s, "Failed to process unknown action: #{action}")
62
- end
510
+
511
+ # 5.1 Variables Used by Ragel
512
+ p = 0
513
+ eof = pe = data.length
514
+ stack = []
515
+
516
+
517
+ begin
518
+ p ||= 0
519
+ pe ||= data.length
520
+ cs = start
521
+ top = 0
522
+ end
523
+
524
+
525
+ begin
526
+ testEof = false
527
+ _slen, _trans, _keys, _inds, _acts, _nacts = nil
528
+ _goto_level = 0
529
+ _resume = 10
530
+ _eof_trans = 15
531
+ _again = 20
532
+ _test_eof = 30
533
+ _out = 40
534
+ while true
535
+ if _goto_level <= 0
536
+ if p == pe
537
+ _goto_level = _test_eof
538
+ next
539
+ end
540
+ if cs == 0
541
+ _goto_level = _out
542
+ next
543
+ end
544
+ end
545
+ if _goto_level <= _resume
546
+ _keys = cs << 1
547
+ _inds = _index_offsets[cs]
548
+ _slen = _key_spans[cs]
549
+ _wide = data[p].ord
550
+ _trans = if ( _slen > 0 &&
551
+ _trans_keys[_keys] <= _wide &&
552
+ _wide <= _trans_keys[_keys + 1]
553
+ ) then
554
+ _indicies[ _inds + _wide - _trans_keys[_keys] ]
555
+ else
556
+ _indicies[ _inds + _slen ]
557
+ end
558
+ cs = _trans_targs[_trans]
559
+ if _trans_actions[_trans] != 0
560
+ case _trans_actions[_trans]
561
+ when 1 then
562
+ begin
563
+ main_type_s = p end
564
+ when 2 then
565
+ begin
566
+ content_type.main_type = data[main_type_s..(p-1)].downcase end
567
+ when 3 then
568
+ begin
569
+ sub_type_s = p end
570
+ when 19 then
571
+ begin
572
+ content_type.sub_type = data[sub_type_s..(p-1)].downcase end
573
+ when 4 then
574
+ begin
575
+ param_attr_s = p end
576
+ when 6 then
577
+ begin
578
+ param_attr = data[param_attr_s..(p-1)] end
579
+ when 9 then
580
+ begin
581
+ qstr_s = p end
582
+ when 11 then
583
+ begin
584
+ qstr = data[qstr_s..(p-1)] end
585
+ when 7 then
586
+ begin
587
+ param_val_s = p end
588
+ when 21 then
589
+ begin
590
+
591
+ if param_attr.nil?
592
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
593
+ end
594
+
595
+ # Use quoted s value if one exists, otherwise use parameter value
596
+ value = qstr || data[param_val_s..(p-1)]
597
+
598
+ content_type.parameters << { param_attr => value }
599
+ param_attr = nil
600
+ qstr = nil
601
+ end
602
+ when 12 then
603
+ begin
604
+ end
605
+ when 15 then
606
+ begin
607
+ end
608
+ when 5 then
609
+ begin
610
+ begin
611
+ stack[top] = cs
612
+ top+= 1
613
+ cs = 28
614
+ _goto_level = _again
615
+ next
616
+ end
617
+ end
618
+ when 18 then
619
+ begin
620
+ begin
621
+ top -= 1
622
+ cs = stack[top]
623
+ _goto_level = _again
624
+ next
625
+ end
626
+ end
627
+ when 20 then
628
+ begin
629
+ content_type.sub_type = data[sub_type_s..(p-1)].downcase end
630
+ begin
631
+ begin
632
+ stack[top] = cs
633
+ top+= 1
634
+ cs = 28
635
+ _goto_level = _again
636
+ next
637
+ end
638
+ end
639
+ when 10 then
640
+ begin
641
+ qstr_s = p end
642
+ begin
643
+ qstr = data[qstr_s..(p-1)] end
644
+ when 8 then
645
+ begin
646
+ param_val_s = p end
647
+ begin
648
+ begin
649
+ stack[top] = cs
650
+ top+= 1
651
+ cs = 28
652
+ _goto_level = _again
653
+ next
654
+ end
655
+ end
656
+ when 25 then
657
+ begin
658
+
659
+ if param_attr.nil?
660
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
661
+ end
662
+
663
+ # Use quoted s value if one exists, otherwise use parameter value
664
+ value = qstr || data[param_val_s..(p-1)]
665
+
666
+ content_type.parameters << { param_attr => value }
667
+ param_attr = nil
668
+ qstr = nil
669
+ end
670
+ begin
671
+ begin
672
+ stack[top] = cs
673
+ top+= 1
674
+ cs = 28
675
+ _goto_level = _again
676
+ next
677
+ end
678
+ end
679
+ when 13 then
680
+ begin
681
+ end
682
+ begin
683
+ param_attr_s = p end
684
+ when 23 then
685
+ begin
686
+ end
687
+ begin
688
+
689
+ if param_attr.nil?
690
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
691
+ end
692
+
693
+ # Use quoted s value if one exists, otherwise use parameter value
694
+ value = qstr || data[param_val_s..(p-1)]
695
+
696
+ content_type.parameters << { param_attr => value }
697
+ param_attr = nil
698
+ qstr = nil
699
+ end
700
+ when 14 then
701
+ begin
702
+ end
703
+ begin
704
+ begin
705
+ stack[top] = cs
706
+ top+= 1
707
+ cs = 28
708
+ _goto_level = _again
709
+ next
710
+ end
711
+ end
712
+ when 16 then
713
+ begin
714
+ end
715
+ begin
716
+ begin
717
+ stack[top] = cs
718
+ top+= 1
719
+ cs = 28
720
+ _goto_level = _again
721
+ next
722
+ end
723
+ end
724
+ when 17 then
725
+ begin
726
+ end
727
+ begin
728
+ begin
729
+ top -= 1
730
+ cs = stack[top]
731
+ _goto_level = _again
732
+ next
733
+ end
734
+ end
735
+ when 22 then
736
+ begin
737
+ begin
738
+ stack[top] = cs
739
+ top+= 1
740
+ cs = 28
741
+ _goto_level = _again
742
+ next
743
+ end
744
+ end
745
+ begin
746
+
747
+ if param_attr.nil?
748
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
749
+ end
750
+
751
+ # Use quoted s value if one exists, otherwise use parameter value
752
+ value = qstr || data[param_val_s..(p-1)]
753
+
754
+ content_type.parameters << { param_attr => value }
755
+ param_attr = nil
756
+ qstr = nil
757
+ end
758
+ when 24 then
759
+ begin
760
+ end
761
+ begin
762
+ begin
763
+ stack[top] = cs
764
+ top+= 1
765
+ cs = 28
766
+ _goto_level = _again
767
+ next
768
+ end
769
+ end
770
+ begin
771
+
772
+ if param_attr.nil?
773
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
774
+ end
775
+
776
+ # Use quoted s value if one exists, otherwise use parameter value
777
+ value = qstr || data[param_val_s..(p-1)]
778
+
779
+ content_type.parameters << { param_attr => value }
780
+ param_attr = nil
781
+ qstr = nil
782
+ end
783
+ end
784
+ end
785
+ end
786
+ if _goto_level <= _again
787
+ if cs == 0
788
+ _goto_level = _out
789
+ next
790
+ end
791
+ p += 1
792
+ if p != pe
793
+ _goto_level = _resume
794
+ next
795
+ end
796
+ end
797
+ if _goto_level <= _test_eof
798
+ if p == eof
799
+ case _eof_actions[cs]
800
+ when 19 then
801
+ begin
802
+ content_type.sub_type = data[sub_type_s..(p-1)].downcase end
803
+ when 21 then
804
+ begin
805
+
806
+ if param_attr.nil?
807
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
808
+ end
809
+
810
+ # Use quoted s value if one exists, otherwise use parameter value
811
+ value = qstr || data[param_val_s..(p-1)]
812
+
813
+ content_type.parameters << { param_attr => value }
814
+ param_attr = nil
815
+ qstr = nil
816
+ end
817
+ when 12 then
818
+ begin
819
+ end
820
+ when 23 then
821
+ begin
822
+ end
823
+ begin
824
+
825
+ if param_attr.nil?
826
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "no attribute for value")
827
+ end
828
+
829
+ # Use quoted s value if one exists, otherwise use parameter value
830
+ value = qstr || data[param_val_s..(p-1)]
831
+
832
+ content_type.parameters << { param_attr => value }
833
+ param_attr = nil
834
+ qstr = nil
835
+ end
836
+ end
837
+ end
838
+
839
+ end
840
+ if _goto_level <= _out
841
+ break
842
+ end
843
+ end
844
+ end
845
+
846
+
847
+ if p != eof || cs < 33
848
+ raise Mail::Field::ParseError.new(Mail::ContentTypeElement, data, "Only able to parse up to #{data[0..p]}")
63
849
  end
850
+
64
851
  content_type
65
852
  end
66
853
  end