Skip to content

Instantly share code, notes, and snippets.

@libc
Created July 8, 2010 11:11
Show Gist options
  • Save libc/467892 to your computer and use it in GitHub Desktop.
Save libc/467892 to your computer and use it in GitHub Desktop.
diff --git a/lib/mail/elements/content_type_element.rb b/lib/mail/elements/content_type_element.rb
index 4bed7b7..83e8d8b 100644
--- a/lib/mail/elements/content_type_element.rb
+++ b/lib/mail/elements/content_type_element.rb
@@ -7,8 +7,8 @@ module Mail
def initialize( string )
parser = Mail::ContentTypeParser.new
if tree = parser.parse(cleaned(string))
- @main_type = tree.main_type.text_value
- @sub_type = tree.sub_type.text_value
+ @main_type = tree.main_type.text_value.downcase
+ @sub_type = tree.sub_type.text_value.downcase
@parameters = tree.parameters
else
raise Mail::Field::ParseError, "ContentTypeElement can not parse |#{string}|\nReason was: #{parser.failure_reason}\n"
diff --git a/lib/mail/parsers/content_type.rb b/lib/mail/parsers/content_type.rb
index 0660640..44a4b8f 100644
--- a/lib/mail/parsers/content_type.rb
+++ b/lib/mail/parsers/content_type.rb
@@ -166,6 +166,21 @@ module Mail
r0
end
+ module DiscreteType0
+ end
+
+ module DiscreteType1
+ end
+
+ module DiscreteType2
+ end
+
+ module DiscreteType3
+ end
+
+ module DiscreteType4
+ end
+
def _nt_discrete_type
start_index = index
if node_cache[:discrete_type].has_key?(index)
@@ -178,59 +193,324 @@ module Mail
end
i0 = index
- if has_terminal?("text", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
- @index += 4
+ i1, s1 = index, []
+ if has_terminal?('\G[tT]', true, index)
+ r2 = true
+ @index += 1
else
- terminal_parse_failure("text")
+ r2 = nil
+ end
+ s1 << r2
+ if r2
+ if has_terminal?('\G[eE]', true, index)
+ r3 = true
+ @index += 1
+ else
+ r3 = nil
+ end
+ s1 << r3
+ if r3
+ if has_terminal?('\G[xX]', true, index)
+ r4 = true
+ @index += 1
+ else
+ r4 = nil
+ end
+ s1 << r4
+ if r4
+ if has_terminal?('\G[tT]', true, index)
+ r5 = true
+ @index += 1
+ else
+ r5 = nil
+ end
+ s1 << r5
+ end
+ end
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(DiscreteType0)
+ else
+ @index = i1
r1 = nil
end
if r1
r0 = r1
else
- if has_terminal?("image", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 5))
- @index += 5
+ i6, s6 = index, []
+ if has_terminal?('\G[iI]', true, index)
+ r7 = true
+ @index += 1
else
- terminal_parse_failure("image")
- r2 = nil
+ r7 = nil
end
- if r2
- r0 = r2
+ s6 << r7
+ if r7
+ if has_terminal?('\G[mM]', true, index)
+ r8 = true
+ @index += 1
+ else
+ r8 = nil
+ end
+ s6 << r8
+ if r8
+ if has_terminal?('\G[aA]', true, index)
+ r9 = true
+ @index += 1
+ else
+ r9 = nil
+ end
+ s6 << r9
+ if r9
+ if has_terminal?('\G[gG]', true, index)
+ r10 = true
+ @index += 1
+ else
+ r10 = nil
+ end
+ s6 << r10
+ if r10
+ if has_terminal?('\G[eE]', true, index)
+ r11 = true
+ @index += 1
+ else
+ r11 = nil
+ end
+ s6 << r11
+ end
+ end
+ end
+ end
+ if s6.last
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
+ r6.extend(DiscreteType1)
else
- if has_terminal?("audio", false, index)
- r3 = instantiate_node(SyntaxNode,input, index...(index + 5))
- @index += 5
+ @index = i6
+ r6 = nil
+ end
+ if r6
+ r0 = r6
+ else
+ i12, s12 = index, []
+ if has_terminal?('\G[aA]', true, index)
+ r13 = true
+ @index += 1
else
- terminal_parse_failure("audio")
- r3 = nil
+ r13 = nil
end
- if r3
- r0 = r3
+ s12 << r13
+ if r13
+ if has_terminal?('\G[uU]', true, index)
+ r14 = true
+ @index += 1
+ else
+ r14 = nil
+ end
+ s12 << r14
+ if r14
+ if has_terminal?('\G[dD]', true, index)
+ r15 = true
+ @index += 1
+ else
+ r15 = nil
+ end
+ s12 << r15
+ if r15
+ if has_terminal?('\G[iI]', true, index)
+ r16 = true
+ @index += 1
+ else
+ r16 = nil
+ end
+ s12 << r16
+ if r16
+ if has_terminal?('\G[oO]', true, index)
+ r17 = true
+ @index += 1
+ else
+ r17 = nil
+ end
+ s12 << r17
+ end
+ end
+ end
+ end
+ if s12.last
+ r12 = instantiate_node(SyntaxNode,input, i12...index, s12)
+ r12.extend(DiscreteType2)
+ else
+ @index = i12
+ r12 = nil
+ end
+ if r12
+ r0 = r12
else
- if has_terminal?("video", false, index)
- r4 = instantiate_node(SyntaxNode,input, index...(index + 5))
- @index += 5
+ i18, s18 = index, []
+ if has_terminal?('\G[vV]', true, index)
+ r19 = true
+ @index += 1
else
- terminal_parse_failure("video")
- r4 = nil
+ r19 = nil
end
- if r4
- r0 = r4
+ s18 << r19
+ if r19
+ if has_terminal?('\G[iI]', true, index)
+ r20 = true
+ @index += 1
+ else
+ r20 = nil
+ end
+ s18 << r20
+ if r20
+ if has_terminal?('\G[dD]', true, index)
+ r21 = true
+ @index += 1
+ else
+ r21 = nil
+ end
+ s18 << r21
+ if r21
+ if has_terminal?('\G[eE]', true, index)
+ r22 = true
+ @index += 1
+ else
+ r22 = nil
+ end
+ s18 << r22
+ if r22
+ if has_terminal?('\G[oO]', true, index)
+ r23 = true
+ @index += 1
+ else
+ r23 = nil
+ end
+ s18 << r23
+ end
+ end
+ end
+ end
+ if s18.last
+ r18 = instantiate_node(SyntaxNode,input, i18...index, s18)
+ r18.extend(DiscreteType3)
else
- if has_terminal?("application", false, index)
- r5 = instantiate_node(SyntaxNode,input, index...(index + 11))
- @index += 11
+ @index = i18
+ r18 = nil
+ end
+ if r18
+ r0 = r18
+ else
+ i24, s24 = index, []
+ if has_terminal?('\G[aA]', true, index)
+ r25 = true
+ @index += 1
else
- terminal_parse_failure("application")
- r5 = nil
+ r25 = nil
end
- if r5
- r0 = r5
+ s24 << r25
+ if r25
+ if has_terminal?('\G[pP]', true, index)
+ r26 = true
+ @index += 1
+ else
+ r26 = nil
+ end
+ s24 << r26
+ if r26
+ if has_terminal?('\G[pP]', true, index)
+ r27 = true
+ @index += 1
+ else
+ r27 = nil
+ end
+ s24 << r27
+ if r27
+ if has_terminal?('\G[lL]', true, index)
+ r28 = true
+ @index += 1
+ else
+ r28 = nil
+ end
+ s24 << r28
+ if r28
+ if has_terminal?('\G[iI]', true, index)
+ r29 = true
+ @index += 1
+ else
+ r29 = nil
+ end
+ s24 << r29
+ if r29
+ if has_terminal?('\G[cC]', true, index)
+ r30 = true
+ @index += 1
+ else
+ r30 = nil
+ end
+ s24 << r30
+ if r30
+ if has_terminal?('\G[aA]', true, index)
+ r31 = true
+ @index += 1
+ else
+ r31 = nil
+ end
+ s24 << r31
+ if r31
+ if has_terminal?('\G[tT]', true, index)
+ r32 = true
+ @index += 1
+ else
+ r32 = nil
+ end
+ s24 << r32
+ if r32
+ if has_terminal?('\G[iI]', true, index)
+ r33 = true
+ @index += 1
+ else
+ r33 = nil
+ end
+ s24 << r33
+ if r33
+ if has_terminal?('\G[oO]', true, index)
+ r34 = true
+ @index += 1
+ else
+ r34 = nil
+ end
+ s24 << r34
+ if r34
+ if has_terminal?('\G[nN]', true, index)
+ r35 = true
+ @index += 1
+ else
+ r35 = nil
+ end
+ s24 << r35
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s24.last
+ r24 = instantiate_node(SyntaxNode,input, i24...index, s24)
+ r24.extend(DiscreteType4)
+ else
+ @index = i24
+ r24 = nil
+ end
+ if r24
+ r0 = r24
else
- r6 = _nt_extension_token
- if r6
- r0 = r6
+ r36 = _nt_extension_token
+ if r36
+ r0 = r36
else
@index = i0
r0 = nil
@@ -246,6 +526,12 @@ module Mail
r0
end
+ module CompositeType0
+ end
+
+ module CompositeType1
+ end
+
def _nt_composite_type
start_index = index
if node_cache[:composite_type].has_key?(index)
@@ -258,29 +544,171 @@ module Mail
end
i0 = index
- if has_terminal?("message", false, index)
- r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
- @index += 7
+ i1, s1 = index, []
+ if has_terminal?('\G[mM]', true, index)
+ r2 = true
+ @index += 1
+ else
+ r2 = nil
+ end
+ s1 << r2
+ if r2
+ if has_terminal?('\G[eE]', true, index)
+ r3 = true
+ @index += 1
+ else
+ r3 = nil
+ end
+ s1 << r3
+ if r3
+ if has_terminal?('\G[sS]', true, index)
+ r4 = true
+ @index += 1
+ else
+ r4 = nil
+ end
+ s1 << r4
+ if r4
+ if has_terminal?('\G[sS]', true, index)
+ r5 = true
+ @index += 1
+ else
+ r5 = nil
+ end
+ s1 << r5
+ if r5
+ if has_terminal?('\G[aA]', true, index)
+ r6 = true
+ @index += 1
+ else
+ r6 = nil
+ end
+ s1 << r6
+ if r6
+ if has_terminal?('\G[gG]', true, index)
+ r7 = true
+ @index += 1
+ else
+ r7 = nil
+ end
+ s1 << r7
+ if r7
+ if has_terminal?('\G[eE]', true, index)
+ r8 = true
+ @index += 1
+ else
+ r8 = nil
+ end
+ s1 << r8
+ end
+ end
+ end
+ end
+ end
+ end
+ if s1.last
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
+ r1.extend(CompositeType0)
else
- terminal_parse_failure("message")
+ @index = i1
r1 = nil
end
if r1
r0 = r1
else
- if has_terminal?("multipart", false, index)
- r2 = instantiate_node(SyntaxNode,input, index...(index + 9))
- @index += 9
+ i9, s9 = index, []
+ if has_terminal?('\G[mM]', true, index)
+ r10 = true
+ @index += 1
else
- terminal_parse_failure("multipart")
- r2 = nil
+ r10 = nil
end
- if r2
- r0 = r2
+ s9 << r10
+ if r10
+ if has_terminal?('\G[uU]', true, index)
+ r11 = true
+ @index += 1
+ else
+ r11 = nil
+ end
+ s9 << r11
+ if r11
+ if has_terminal?('\G[lL]', true, index)
+ r12 = true
+ @index += 1
+ else
+ r12 = nil
+ end
+ s9 << r12
+ if r12
+ if has_terminal?('\G[tT]', true, index)
+ r13 = true
+ @index += 1
+ else
+ r13 = nil
+ end
+ s9 << r13
+ if r13
+ if has_terminal?('\G[iI]', true, index)
+ r14 = true
+ @index += 1
+ else
+ r14 = nil
+ end
+ s9 << r14
+ if r14
+ if has_terminal?('\G[pP]', true, index)
+ r15 = true
+ @index += 1
+ else
+ r15 = nil
+ end
+ s9 << r15
+ if r15
+ if has_terminal?('\G[aA]', true, index)
+ r16 = true
+ @index += 1
+ else
+ r16 = nil
+ end
+ s9 << r16
+ if r16
+ if has_terminal?('\G[rR]', true, index)
+ r17 = true
+ @index += 1
+ else
+ r17 = nil
+ end
+ s9 << r17
+ if r17
+ if has_terminal?('\G[tT]', true, index)
+ r18 = true
+ @index += 1
+ else
+ r18 = nil
+ end
+ s9 << r18
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ if s9.last
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
+ r9.extend(CompositeType1)
else
- r3 = _nt_extension_token
- if r3
- r0 = r3
+ @index = i9
+ r9 = nil
+ end
+ if r9
+ r0 = r9
+ else
+ r19 = _nt_extension_token
+ if r19
+ r0 = r19
else
@index = i0
r0 = nil
diff --git a/lib/mail/parsers/content_type.treetop b/lib/mail/parsers/content_type.treetop
index e511425..7f3cbf5 100644
--- a/lib/mail/parsers/content_type.treetop
+++ b/lib/mail/parsers/content_type.treetop
@@ -19,11 +19,11 @@ module Mail
end
rule discrete_type
- "text" / "image" / "audio" / "video" / "application" / extension_token
+ [tT] [eE] [xX] [tT] / [iI] [mM] [aA] [gG] [eE] / [aA] [uU] [dD] [iI] [oO] / [vV] [iI] [dD] [eE] [oO] / [aA] [pP] [pP] [lL] [iI] [cC] [aA] [tT] [iI] [oO] [nN] / extension_token
end
rule composite_type
- "message" / "multipart" / extension_token
+ [mM] [eE] [sS] [sS] [aA] [gG] [eE] / [mM] [uU] [lL] [tT] [iI] [pP] [aA] [rR] [tT] / extension_token
end
rule extension_token
diff --git a/spec/mail/fields/content_type_field_spec.rb b/spec/mail/fields/content_type_field_spec.rb
index 9ee8c0c..8c1360a 100644
--- a/spec/mail/fields/content_type_field_spec.rb
+++ b/spec/mail/fields/content_type_field_spec.rb
@@ -536,7 +536,15 @@ describe Mail::ContentTypeField do
c.sub_type.should == 'related'
c.parameters.should == {'boundary' => '1_4626B816_9F1690', 'Type' => 'application/smil', 'Start' => '<mms.smil.txt>'}
end
-
+
+ it "should handle 'IMAGE/JPEG; name=\"IM 006.jpg\"'" do
+ string = %q{IMAGE/JPEG; name="IM 006.jpg"}
+ c = Mail::ContentTypeField.new(string)
+ c.content_type.should == 'image/jpeg'
+ c.main_type.should == 'image'
+ c.sub_type.should == 'jpeg'
+ c.parameters.should == {'name' => "IM 006.jpg"}
+ end
end
describe "finding a filename" do
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment