mail 2.7.0.rc1 → 2.7.0

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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +71 -98
  3. data/lib/mail/attachments_list.rb +5 -2
  4. data/lib/mail/body.rb +39 -33
  5. data/lib/mail/check_delivery_params.rb +8 -6
  6. data/lib/mail/configuration.rb +2 -0
  7. data/lib/mail/elements/address.rb +19 -18
  8. data/lib/mail/encodings/7bit.rb +5 -15
  9. data/lib/mail/encodings/8bit.rb +2 -21
  10. data/lib/mail/encodings/base64.rb +11 -12
  11. data/lib/mail/encodings/binary.rb +3 -22
  12. data/lib/mail/encodings/identity.rb +24 -0
  13. data/lib/mail/encodings/quoted_printable.rb +6 -6
  14. data/lib/mail/encodings/transfer_encoding.rb +38 -29
  15. data/lib/mail/encodings/unix_to_unix.rb +2 -1
  16. data/lib/mail/encodings.rb +89 -31
  17. data/lib/mail/envelope.rb +1 -1
  18. data/lib/mail/field.rb +93 -61
  19. data/lib/mail/fields/bcc_field.rb +2 -2
  20. data/lib/mail/fields/cc_field.rb +1 -1
  21. data/lib/mail/fields/comments_field.rb +1 -1
  22. data/lib/mail/fields/common/common_address.rb +32 -7
  23. data/lib/mail/fields/common/common_field.rb +1 -10
  24. data/lib/mail/fields/content_description_field.rb +1 -1
  25. data/lib/mail/fields/content_disposition_field.rb +3 -3
  26. data/lib/mail/fields/content_id_field.rb +2 -2
  27. data/lib/mail/fields/content_location_field.rb +1 -1
  28. data/lib/mail/fields/content_transfer_encoding_field.rb +1 -1
  29. data/lib/mail/fields/content_type_field.rb +1 -1
  30. data/lib/mail/fields/date_field.rb +2 -3
  31. data/lib/mail/fields/from_field.rb +1 -1
  32. data/lib/mail/fields/in_reply_to_field.rb +1 -1
  33. data/lib/mail/fields/keywords_field.rb +1 -1
  34. data/lib/mail/fields/message_id_field.rb +1 -1
  35. data/lib/mail/fields/mime_version_field.rb +1 -1
  36. data/lib/mail/fields/optional_field.rb +4 -1
  37. data/lib/mail/fields/received_field.rb +1 -1
  38. data/lib/mail/fields/references_field.rb +1 -1
  39. data/lib/mail/fields/reply_to_field.rb +1 -1
  40. data/lib/mail/fields/resent_bcc_field.rb +1 -1
  41. data/lib/mail/fields/resent_cc_field.rb +1 -1
  42. data/lib/mail/fields/resent_date_field.rb +0 -1
  43. data/lib/mail/fields/resent_from_field.rb +1 -1
  44. data/lib/mail/fields/resent_message_id_field.rb +1 -1
  45. data/lib/mail/fields/resent_sender_field.rb +1 -1
  46. data/lib/mail/fields/resent_to_field.rb +1 -1
  47. data/lib/mail/fields/return_path_field.rb +1 -1
  48. data/lib/mail/fields/sender_field.rb +1 -1
  49. data/lib/mail/fields/subject_field.rb +1 -1
  50. data/lib/mail/fields/to_field.rb +1 -1
  51. data/lib/mail/fields/unstructured_field.rb +19 -2
  52. data/lib/mail/header.rb +9 -8
  53. data/lib/mail/mail.rb +2 -10
  54. data/lib/mail/matchers/has_sent_mail.rb +21 -1
  55. data/lib/mail/message.rb +63 -50
  56. data/lib/mail/multibyte/chars.rb +2 -1
  57. data/lib/mail/multibyte.rb +14 -16
  58. data/lib/mail/network/delivery_methods/exim.rb +6 -10
  59. data/lib/mail/network/delivery_methods/logger_delivery.rb +37 -0
  60. data/lib/mail/network/delivery_methods/sendmail.rb +14 -7
  61. data/lib/mail/network/delivery_methods/smtp.rb +56 -55
  62. data/lib/mail/network/delivery_methods/smtp_connection.rb +9 -1
  63. data/lib/mail/network/retriever_methods/imap.rb +18 -5
  64. data/lib/mail/network/retriever_methods/pop3.rb +3 -1
  65. data/lib/mail/network.rb +1 -0
  66. data/lib/mail/parser_tools.rb +15 -0
  67. data/lib/mail/parsers/address_lists_parser.rb +30462 -12597
  68. data/lib/mail/parsers/address_lists_parser.rl +18 -12
  69. data/lib/mail/parsers/content_disposition_parser.rb +405 -215
  70. data/lib/mail/parsers/content_disposition_parser.rl +11 -5
  71. data/lib/mail/parsers/content_location_parser.rb +443 -208
  72. data/lib/mail/parsers/content_location_parser.rl +9 -3
  73. data/lib/mail/parsers/content_transfer_encoding_parser.rb +180 -80
  74. data/lib/mail/parsers/content_transfer_encoding_parser.rl +8 -2
  75. data/lib/mail/parsers/content_type_parser.rb +436 -245
  76. data/lib/mail/parsers/content_type_parser.rl +12 -6
  77. data/lib/mail/parsers/date_time_parser.rb +172 -72
  78. data/lib/mail/parsers/date_time_parser.rl +10 -4
  79. data/lib/mail/parsers/envelope_from_parser.rb +2833 -1320
  80. data/lib/mail/parsers/envelope_from_parser.rl +9 -3
  81. data/lib/mail/parsers/message_ids_parser.rb +2325 -976
  82. data/lib/mail/parsers/message_ids_parser.rl +9 -3
  83. data/lib/mail/parsers/mime_version_parser.rb +164 -64
  84. data/lib/mail/parsers/mime_version_parser.rl +9 -3
  85. data/lib/mail/parsers/phrase_lists_parser.rb +582 -237
  86. data/lib/mail/parsers/phrase_lists_parser.rl +9 -3
  87. data/lib/mail/parsers/received_parser.rb +7036 -3004
  88. data/lib/mail/parsers/received_parser.rl +11 -5
  89. data/lib/mail/parsers/rfc2045_content_transfer_encoding.rl +1 -0
  90. data/lib/mail/parsers/rfc2045_content_type.rl +1 -0
  91. data/lib/mail/parsers/rfc2045_mime.rl +1 -0
  92. data/lib/mail/parsers/rfc2183_content_disposition.rl +1 -0
  93. data/lib/mail/parsers/rfc3629_utf8.rl +19 -0
  94. data/lib/mail/parsers/rfc5234_abnf_core_rules.rl +7 -1
  95. data/lib/mail/parsers/rfc5322.rl +3 -1
  96. data/lib/mail/parsers/rfc5322_address.rl +3 -1
  97. data/lib/mail/parsers/rfc5322_date_time.rl +1 -0
  98. data/lib/mail/parsers/rfc5322_lexical_tokens.rl +9 -5
  99. data/lib/mail/part.rb +1 -1
  100. data/lib/mail/utilities.rb +44 -15
  101. data/lib/mail/version.rb +1 -1
  102. data/lib/mail/version_specific/ruby_1_8.rb +12 -1
  103. data/lib/mail/version_specific/ruby_1_9.rb +13 -1
  104. data/lib/mail.rb +1 -6
  105. metadata +9 -15
  106. data/CHANGELOG.rdoc +0 -822
  107. data/CONTRIBUTING.md +0 -60
  108. data/Dependencies.txt +0 -1
  109. data/Gemfile +0 -11
  110. data/Rakefile +0 -23
  111. data/TODO.rdoc +0 -9
  112. data/lib/mail/multibyte/exceptions.rb +0 -9
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  require 'mail/utilities'
3
+ require 'mail/parser_tools'
3
4
 
4
5
  %%{
5
6
  # RFC 5322 Section 3.6.4: Identification Fields
6
7
  # https://tools.ietf.org/html/rfc5322#section-3.6.4
7
8
  machine message_ids;
9
+ alphtype int;
8
10
 
9
11
  # Message Ids
10
12
  action msg_id_s { msg_id_s = p }
11
- action msg_id_e { message_ids.message_ids << data[msg_id_s..(p-1)].rstrip }
13
+ action msg_id_e { message_ids.message_ids << chars(data, msg_id_s, p-1).rstrip }
12
14
 
13
15
  # No-op actions
14
16
  action angle_addr_s {}
@@ -47,12 +49,16 @@ require 'mail/utilities'
47
49
 
48
50
  module Mail::Parsers
49
51
  module MessageIdsParser
52
+ extend Mail::ParserTools
53
+
50
54
  MessageIdsStruct = Struct.new(:message_ids, :error)
51
55
 
52
56
  %%write data noprefix;
53
57
 
54
58
  def self.parse(data)
55
- raise Mail::Field::ParseError.new(Mail::MessageIdsElement, data, 'nil is invalid') if data.nil?
59
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
60
+
61
+ raise Mail::Field::NilParseError.new(Mail::MessageIdsElement) if data.nil?
56
62
 
57
63
  # Parser state
58
64
  message_ids = MessageIdsStruct.new([])
@@ -67,7 +73,7 @@ module Mail::Parsers
67
73
  %%write exec;
68
74
 
69
75
  if p != eof || cs < %%{ write first_final; }%%
70
- raise Mail::Field::ParseError.new(Mail::MessageIdsElement, data, "Only able to parse up to #{data[0..p]}")
76
+ raise Mail::Field::IncompleteParseError.new(Mail::MessageIdsElement, data, p)
71
77
  end
72
78
 
73
79
  message_ids
@@ -1,12 +1,15 @@
1
1
 
2
2
  # frozen_string_literal: true
3
3
  require 'mail/utilities'
4
+ require 'mail/parser_tools'
4
5
 
5
6
 
6
7
 
7
8
 
8
9
  module Mail::Parsers
9
10
  module MimeVersionParser
11
+ extend Mail::ParserTools
12
+
10
13
  MimeVersionStruct = Struct.new(:major, :minor, :error)
11
14
 
12
15
 
@@ -19,10 +22,13 @@ self._trans_keys = [
19
22
  9, 32, 9, 57, 40,
20
23
  57, 46, 46, 40, 57,
21
24
  48, 57, 10, 10, 9, 32,
22
- 1, 127, 1, 127, 10,
23
- 10, 9, 32, 0, 127,
24
- 9, 57, 9, 40, 9, 40,
25
- 0, 0, 0
25
+ 1, 244, 1, 244, 10,
26
+ 10, 9, 32, 0, 244,
27
+ 128, 191, 160, 191, 128, 191,
28
+ 128, 159, 144, 191, 128,
29
+ 191, 128, 143, 9, 57,
30
+ 9, 40, 9, 40, 0, 0,
31
+ 0
26
32
  ]
27
33
 
28
34
  class << self
@@ -31,8 +37,9 @@ class << self
31
37
  end
32
38
  self._key_spans = [
33
39
  0, 49, 1, 24, 49, 18, 1, 18,
34
- 10, 1, 24, 127, 127, 1, 24, 128,
35
- 49, 32, 32, 0
40
+ 10, 1, 24, 244, 244, 1, 24, 245,
41
+ 64, 32, 64, 32, 48, 64, 16, 49,
42
+ 32, 32, 0
36
43
  ]
37
44
 
38
45
  class << self
@@ -41,8 +48,9 @@ class << self
41
48
  end
42
49
  self._index_offsets = [
43
50
  0, 0, 50, 52, 77, 127, 146, 148,
44
- 167, 178, 180, 205, 333, 461, 463, 488,
45
- 617, 667, 700, 733
51
+ 167, 178, 180, 205, 450, 695, 697, 722,
52
+ 968, 1033, 1066, 1131, 1164, 1213, 1278, 1295,
53
+ 1345, 1378, 1411
46
54
  ]
47
55
 
48
56
  class << self
@@ -91,57 +99,142 @@ self._indicies = [
91
99
  19, 19, 19, 19, 19, 19, 19, 19,
92
100
  19, 19, 19, 19, 19, 19, 19, 19,
93
101
  19, 19, 19, 19, 19, 19, 19, 19,
94
- 19, 19, 19, 19, 1, 24, 24, 24,
95
- 24, 24, 24, 24, 24, 24, 1, 24,
96
- 24, 25, 24, 24, 24, 24, 24, 24,
97
- 24, 24, 24, 24, 24, 24, 24, 24,
98
- 24, 24, 24, 24, 24, 24, 24, 24,
99
- 24, 24, 24, 24, 26, 27, 24, 24,
100
- 24, 24, 24, 24, 24, 24, 24, 24,
101
- 24, 24, 24, 24, 24, 24, 24, 24,
102
- 24, 24, 24, 24, 24, 24, 24, 24,
103
- 24, 24, 24, 24, 24, 24, 24, 24,
104
- 24, 24, 24, 24, 24, 24, 24, 24,
105
- 24, 24, 24, 24, 24, 24, 24, 24,
106
- 28, 24, 24, 24, 24, 24, 24, 24,
107
- 24, 24, 24, 24, 24, 24, 24, 24,
108
- 24, 24, 24, 24, 24, 24, 24, 24,
109
- 24, 24, 24, 24, 24, 24, 24, 24,
110
- 24, 24, 24, 24, 1, 29, 1, 24,
102
+ 19, 19, 19, 19, 1, 1, 1, 1,
111
103
  1, 1, 1, 1, 1, 1, 1, 1,
112
104
  1, 1, 1, 1, 1, 1, 1, 1,
113
- 1, 1, 1, 1, 1, 1, 24, 1,
114
- 24, 24, 24, 24, 24, 24, 24, 24,
115
- 24, 24, 24, 24, 24, 24, 24, 24,
116
- 24, 24, 24, 24, 24, 24, 24, 24,
117
- 24, 24, 24, 24, 24, 24, 24, 24,
118
- 24, 24, 24, 24, 24, 24, 24, 24,
119
- 24, 24, 24, 24, 24, 24, 24, 24,
120
- 24, 24, 24, 24, 24, 24, 24, 24,
121
- 24, 24, 24, 24, 24, 24, 24, 24,
122
- 24, 24, 24, 24, 24, 24, 24, 24,
123
- 24, 24, 24, 24, 24, 24, 24, 24,
124
- 24, 24, 24, 24, 24, 24, 24, 24,
125
- 24, 24, 24, 24, 24, 24, 24, 24,
126
- 24, 24, 24, 24, 24, 24, 24, 24,
105
+ 1, 1, 1, 1, 1, 1, 1, 1,
106
+ 1, 1, 1, 1, 1, 1, 1, 1,
107
+ 1, 1, 1, 1, 1, 1, 1, 1,
108
+ 1, 1, 1, 1, 1, 1, 1, 1,
109
+ 1, 1, 1, 1, 1, 1, 1, 1,
110
+ 1, 1, 1, 1, 1, 1, 24, 24,
127
111
  24, 24, 24, 24, 24, 24, 24, 24,
128
112
  24, 24, 24, 24, 24, 24, 24, 24,
129
113
  24, 24, 24, 24, 24, 24, 24, 24,
130
- 1, 30, 1, 1, 1, 31, 1, 1,
114
+ 24, 24, 24, 24, 25, 26, 26, 26,
115
+ 26, 26, 26, 26, 26, 26, 26, 26,
116
+ 26, 27, 26, 26, 28, 29, 29, 29,
117
+ 30, 1, 31, 31, 31, 31, 31, 31,
118
+ 31, 31, 31, 1, 31, 31, 32, 31,
119
+ 31, 31, 31, 31, 31, 31, 31, 31,
120
+ 31, 31, 31, 31, 31, 31, 31, 31,
121
+ 31, 31, 31, 31, 31, 31, 31, 31,
122
+ 31, 33, 34, 31, 31, 31, 31, 31,
123
+ 31, 31, 31, 31, 31, 31, 31, 31,
124
+ 31, 31, 31, 31, 31, 31, 31, 31,
125
+ 31, 31, 31, 31, 31, 31, 31, 31,
126
+ 31, 31, 31, 31, 31, 31, 31, 31,
127
+ 31, 31, 31, 31, 31, 31, 31, 31,
128
+ 31, 31, 31, 31, 31, 35, 31, 31,
129
+ 31, 31, 31, 31, 31, 31, 31, 31,
130
+ 31, 31, 31, 31, 31, 31, 31, 31,
131
+ 31, 31, 31, 31, 31, 31, 31, 31,
132
+ 31, 31, 31, 31, 31, 31, 31, 31,
133
+ 31, 1, 1, 1, 1, 1, 1, 1,
134
+ 1, 1, 1, 1, 1, 1, 1, 1,
135
+ 1, 1, 1, 1, 1, 1, 1, 1,
136
+ 1, 1, 1, 1, 1, 1, 1, 1,
137
+ 1, 1, 1, 1, 1, 1, 1, 1,
138
+ 1, 1, 1, 1, 1, 1, 1, 1,
139
+ 1, 1, 1, 1, 1, 1, 1, 1,
131
140
  1, 1, 1, 1, 1, 1, 1, 1,
141
+ 1, 1, 1, 36, 36, 36, 36, 36,
142
+ 36, 36, 36, 36, 36, 36, 36, 36,
143
+ 36, 36, 36, 36, 36, 36, 36, 36,
144
+ 36, 36, 36, 36, 36, 36, 36, 36,
145
+ 36, 37, 38, 38, 38, 38, 38, 38,
146
+ 38, 38, 38, 38, 38, 38, 39, 38,
147
+ 38, 40, 41, 41, 41, 42, 1, 43,
148
+ 1, 31, 1, 1, 1, 1, 1, 1,
132
149
  1, 1, 1, 1, 1, 1, 1, 1,
133
- 30, 1, 1, 1, 1, 1, 1, 1,
134
- 32, 1, 1, 1, 1, 1, 1, 1,
135
- 33, 33, 33, 33, 33, 33, 33, 33,
136
- 33, 33, 1, 18, 1, 1, 1, 34,
137
150
  1, 1, 1, 1, 1, 1, 1, 1,
151
+ 31, 1, 31, 31, 31, 31, 31, 31,
152
+ 31, 31, 31, 31, 31, 31, 31, 31,
153
+ 31, 31, 31, 31, 31, 31, 31, 31,
154
+ 31, 31, 31, 31, 31, 31, 31, 31,
155
+ 31, 31, 31, 31, 31, 31, 31, 31,
156
+ 31, 31, 31, 31, 31, 31, 31, 31,
157
+ 31, 31, 31, 31, 31, 31, 31, 31,
158
+ 31, 31, 31, 31, 31, 31, 31, 31,
159
+ 31, 31, 31, 31, 31, 31, 31, 31,
160
+ 31, 31, 31, 31, 31, 31, 31, 31,
161
+ 31, 31, 31, 31, 31, 31, 31, 31,
162
+ 31, 31, 31, 31, 31, 31, 31, 31,
163
+ 31, 31, 31, 31, 31, 31, 31, 31,
164
+ 31, 31, 31, 31, 31, 31, 31, 31,
165
+ 31, 31, 31, 31, 31, 31, 31, 31,
166
+ 31, 31, 31, 31, 31, 31, 31, 31,
167
+ 31, 31, 1, 1, 1, 1, 1, 1,
138
168
  1, 1, 1, 1, 1, 1, 1, 1,
139
- 1, 1, 18, 1, 1, 1, 1, 1,
140
- 1, 1, 35, 1, 36, 1, 1, 1,
141
- 37, 1, 1, 1, 1, 1, 1, 1,
142
169
  1, 1, 1, 1, 1, 1, 1, 1,
143
- 1, 1, 1, 36, 1, 1, 1, 1,
144
- 1, 1, 1, 38, 1, 1, 0
170
+ 1, 1, 1, 1, 1, 1, 1, 1,
171
+ 1, 1, 1, 1, 1, 1, 1, 1,
172
+ 1, 1, 1, 1, 1, 1, 1, 1,
173
+ 1, 1, 1, 1, 1, 1, 1, 1,
174
+ 1, 1, 1, 1, 1, 1, 1, 1,
175
+ 1, 1, 1, 1, 36, 36, 36, 36,
176
+ 36, 36, 36, 36, 36, 36, 36, 36,
177
+ 36, 36, 36, 36, 36, 36, 36, 36,
178
+ 36, 36, 36, 36, 36, 36, 36, 36,
179
+ 36, 36, 37, 38, 38, 38, 38, 38,
180
+ 38, 38, 38, 38, 38, 38, 38, 39,
181
+ 38, 38, 40, 41, 41, 41, 42, 1,
182
+ 31, 31, 31, 31, 31, 31, 31, 31,
183
+ 31, 31, 31, 31, 31, 31, 31, 31,
184
+ 31, 31, 31, 31, 31, 31, 31, 31,
185
+ 31, 31, 31, 31, 31, 31, 31, 31,
186
+ 31, 31, 31, 31, 31, 31, 31, 31,
187
+ 31, 31, 31, 31, 31, 31, 31, 31,
188
+ 31, 31, 31, 31, 31, 31, 31, 31,
189
+ 31, 31, 31, 31, 31, 31, 31, 31,
190
+ 1, 36, 36, 36, 36, 36, 36, 36,
191
+ 36, 36, 36, 36, 36, 36, 36, 36,
192
+ 36, 36, 36, 36, 36, 36, 36, 36,
193
+ 36, 36, 36, 36, 36, 36, 36, 36,
194
+ 36, 1, 36, 36, 36, 36, 36, 36,
195
+ 36, 36, 36, 36, 36, 36, 36, 36,
196
+ 36, 36, 36, 36, 36, 36, 36, 36,
197
+ 36, 36, 36, 36, 36, 36, 36, 36,
198
+ 36, 36, 36, 36, 36, 36, 36, 36,
199
+ 36, 36, 36, 36, 36, 36, 36, 36,
200
+ 36, 36, 36, 36, 36, 36, 36, 36,
201
+ 36, 36, 36, 36, 36, 36, 36, 36,
202
+ 36, 36, 1, 36, 36, 36, 36, 36,
203
+ 36, 36, 36, 36, 36, 36, 36, 36,
204
+ 36, 36, 36, 36, 36, 36, 36, 36,
205
+ 36, 36, 36, 36, 36, 36, 36, 36,
206
+ 36, 36, 36, 1, 38, 38, 38, 38,
207
+ 38, 38, 38, 38, 38, 38, 38, 38,
208
+ 38, 38, 38, 38, 38, 38, 38, 38,
209
+ 38, 38, 38, 38, 38, 38, 38, 38,
210
+ 38, 38, 38, 38, 38, 38, 38, 38,
211
+ 38, 38, 38, 38, 38, 38, 38, 38,
212
+ 38, 38, 38, 38, 1, 38, 38, 38,
213
+ 38, 38, 38, 38, 38, 38, 38, 38,
214
+ 38, 38, 38, 38, 38, 38, 38, 38,
215
+ 38, 38, 38, 38, 38, 38, 38, 38,
216
+ 38, 38, 38, 38, 38, 38, 38, 38,
217
+ 38, 38, 38, 38, 38, 38, 38, 38,
218
+ 38, 38, 38, 38, 38, 38, 38, 38,
219
+ 38, 38, 38, 38, 38, 38, 38, 38,
220
+ 38, 38, 38, 38, 38, 1, 38, 38,
221
+ 38, 38, 38, 38, 38, 38, 38, 38,
222
+ 38, 38, 38, 38, 38, 38, 1, 44,
223
+ 1, 1, 1, 45, 1, 1, 1, 1,
224
+ 1, 1, 1, 1, 1, 1, 1, 1,
225
+ 1, 1, 1, 1, 1, 1, 44, 1,
226
+ 1, 1, 1, 1, 1, 1, 46, 1,
227
+ 1, 1, 1, 1, 1, 1, 47, 47,
228
+ 47, 47, 47, 47, 47, 47, 47, 47,
229
+ 1, 18, 1, 1, 1, 48, 1, 1,
230
+ 1, 1, 1, 1, 1, 1, 1, 1,
231
+ 1, 1, 1, 1, 1, 1, 1, 1,
232
+ 18, 1, 1, 1, 1, 1, 1, 1,
233
+ 49, 1, 50, 1, 1, 1, 51, 1,
234
+ 1, 1, 1, 1, 1, 1, 1, 1,
235
+ 1, 1, 1, 1, 1, 1, 1, 1,
236
+ 1, 50, 1, 1, 1, 1, 1, 1,
237
+ 1, 52, 1, 1, 0
145
238
  ]
146
239
 
147
240
  class << self
@@ -150,10 +243,12 @@ class << self
150
243
  end
151
244
  self._trans_targs = [
152
245
  1, 0, 2, 4, 5, 3, 1, 2,
153
- 4, 5, 6, 7, 5, 7, 8, 16,
154
- 16, 10, 17, 12, 13, 12, 19, 15,
155
- 12, 13, 12, 19, 15, 14, 17, 9,
156
- 18, 16, 9, 18, 17, 9, 18
246
+ 4, 5, 6, 7, 5, 7, 8, 23,
247
+ 23, 10, 24, 12, 13, 12, 26, 15,
248
+ 16, 17, 18, 19, 20, 21, 22, 12,
249
+ 13, 12, 26, 15, 16, 17, 18, 19,
250
+ 20, 21, 22, 14, 24, 9, 25, 23,
251
+ 9, 25, 24, 9, 25
157
252
  ]
158
253
 
159
254
  class << self
@@ -164,8 +259,10 @@ self._trans_actions = [
164
259
  0, 0, 0, 1, 2, 0, 3, 3,
165
260
  4, 5, 6, 7, 0, 3, 1, 8,
166
261
  9, 0, 0, 10, 10, 11, 12, 10,
167
- 0, 0, 1, 13, 0, 0, 14, 14,
168
- 15, 0, 0, 1, 3, 3, 4
262
+ 10, 10, 10, 10, 10, 10, 10, 0,
263
+ 0, 1, 13, 0, 0, 0, 0, 0,
264
+ 0, 0, 0, 0, 14, 14, 15, 0,
265
+ 0, 1, 3, 3, 4
169
266
  ]
170
267
 
171
268
  class << self
@@ -175,7 +272,8 @@ end
175
272
  self._eof_actions = [
176
273
  0, 0, 0, 0, 0, 0, 0, 0,
177
274
  0, 0, 0, 0, 0, 0, 0, 0,
178
- 14, 0, 3, 0
275
+ 0, 0, 0, 0, 0, 0, 0, 14,
276
+ 0, 3, 0
179
277
  ]
180
278
 
181
279
  class << self
@@ -185,7 +283,7 @@ self.start = 1;
185
283
  class << self
186
284
  attr_accessor :first_final
187
285
  end
188
- self.first_final = 16;
286
+ self.first_final = 23;
189
287
  class << self
190
288
  attr_accessor :error
191
289
  end
@@ -203,6 +301,8 @@ self.en_main = 1;
203
301
 
204
302
 
205
303
  def self.parse(data)
304
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
305
+
206
306
  return MimeVersionStruct.new('', nil) if Mail::Utilities.blank?(data)
207
307
 
208
308
  # Parser state
@@ -264,13 +364,13 @@ begin
264
364
  major_digits_s = p end
265
365
  when 7 then
266
366
  begin
267
- mime_version.major = data[major_digits_s..(p-1)] end
367
+ mime_version.major = chars(data, major_digits_s, p-1) end
268
368
  when 8 then
269
369
  begin
270
370
  minor_digits_s = p end
271
371
  when 14 then
272
372
  begin
273
- mime_version.minor = data[minor_digits_s..(p-1)] end
373
+ mime_version.minor = chars(data, minor_digits_s, p-1) end
274
374
  when 10 then
275
375
  begin
276
376
  end
@@ -298,7 +398,7 @@ begin
298
398
  end
299
399
  when 6 then
300
400
  begin
301
- mime_version.major = data[major_digits_s..(p-1)] end
401
+ mime_version.major = chars(data, major_digits_s, p-1) end
302
402
  begin
303
403
  begin
304
404
  stack[top] = cs
@@ -310,7 +410,7 @@ begin
310
410
  end
311
411
  when 15 then
312
412
  begin
313
- mime_version.minor = data[minor_digits_s..(p-1)] end
413
+ mime_version.minor = chars(data, minor_digits_s, p-1) end
314
414
  begin
315
415
  begin
316
416
  stack[top] = cs
@@ -384,7 +484,7 @@ begin
384
484
  case _eof_actions[cs]
385
485
  when 14 then
386
486
  begin
387
- mime_version.minor = data[minor_digits_s..(p-1)] end
487
+ mime_version.minor = chars(data, minor_digits_s, p-1) end
388
488
  when 3 then
389
489
  begin
390
490
  end
@@ -399,8 +499,8 @@ end
399
499
  end
400
500
 
401
501
 
402
- if p != eof || cs < 16
403
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, data, "Only able to parse up to #{data[0..p]}")
502
+ if p != eof || cs < 23
503
+ raise Mail::Field::IncompleteParseError.new(Mail::MimeVersionElement, data, p)
404
504
  end
405
505
 
406
506
  mime_version
@@ -1,16 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
  require 'mail/utilities'
3
+ require 'mail/parser_tools'
3
4
 
4
5
  %%{
5
6
  machine mime_version;
7
+ alphtype int;
6
8
 
7
9
  # Major Digits
8
10
  action major_digits_s { major_digits_s = p }
9
- action major_digits_e { mime_version.major = data[major_digits_s..(p-1)] }
11
+ action major_digits_e { mime_version.major = chars(data, major_digits_s, p-1) }
10
12
 
11
13
  # Minor Digits
12
14
  action minor_digits_s { minor_digits_s = p }
13
- action minor_digits_e { mime_version.minor = data[minor_digits_s..(p-1)] }
15
+ action minor_digits_e { mime_version.minor = chars(data, minor_digits_s, p-1) }
14
16
 
15
17
  # No-op actions
16
18
  action comment_s {}
@@ -26,11 +28,15 @@ require 'mail/utilities'
26
28
 
27
29
  module Mail::Parsers
28
30
  module MimeVersionParser
31
+ extend Mail::ParserTools
32
+
29
33
  MimeVersionStruct = Struct.new(:major, :minor, :error)
30
34
 
31
35
  %%write data noprefix;
32
36
 
33
37
  def self.parse(data)
38
+ data = data.dup.force_encoding(Encoding::ASCII_8BIT) if data.respond_to?(:force_encoding)
39
+
34
40
  return MimeVersionStruct.new('', nil) if Mail::Utilities.blank?(data)
35
41
 
36
42
  # Parser state
@@ -46,7 +52,7 @@ module Mail::Parsers
46
52
  %%write exec;
47
53
 
48
54
  if p != eof || cs < %%{ write first_final; }%%
49
- raise Mail::Field::ParseError.new(Mail::MimeVersionElement, data, "Only able to parse up to #{data[0..p]}")
55
+ raise Mail::Field::IncompleteParseError.new(Mail::MimeVersionElement, data, p)
50
56
  end
51
57
 
52
58
  mime_version