diff --git a/lib/mail/fields/content_disposition_field.rb b/lib/mail/fields/content_disposition_field.rb index 97c277f98..52ffca9e2 100644 --- a/lib/mail/fields/content_disposition_field.rb +++ b/lib/mail/fields/content_disposition_field.rb @@ -14,7 +14,13 @@ def initialize(value = nil, charset = nil) end def element - @element ||= Mail::ContentDispositionElement.new(value) + @element ||= + begin + Mail::ContentDispositionElement.new(value) + rescue Mail::Field::ParseError + # Sanitize the value, handle special cases + Mail::ContentDispositionElement.new(sanitize(value)) + end end def disposition_type @@ -40,5 +46,14 @@ def decoded p = "; #{parameters.decoded}" if parameters.length > 0 "#{disposition_type}#{p}" end + + private + + def sanitize(val) + val. + gsub(/\s*=\s*/,'='). # remove whitespaces around equal sign + gsub(/[; ]+/, '; '). # use '; ' as a separator (or EOL) + gsub(/;\s*$/,'') # remove trailing to keep examples below + end end end diff --git a/lib/mail/fields/content_type_field.rb b/lib/mail/fields/content_type_field.rb index 686d533ae..1c1ba3233 100644 --- a/lib/mail/fields/content_type_field.rb +++ b/lib/mail/fields/content_type_field.rb @@ -42,14 +42,6 @@ def element end end - def attempt_to_clean - # Sanitize the value, handle special cases - Mail::ContentTypeElement.new(sanitize(value)) - rescue Mail::Field::ParseError - # All else fails, just get the MIME media type - Mail::ContentTypeElement.new(get_mime_type(value)) - end - def main_type @main_type ||= element.main_type end @@ -103,6 +95,14 @@ def decoded private + def attempt_to_clean + # Sanitize the value, handle special cases + Mail::ContentTypeElement.new(sanitize(value)) + rescue Mail::Field::ParseError + # All else fails, just get the MIME media type + Mail::ContentTypeElement.new(get_mime_type(value)) + end + def method_missing(name, *args, &block) if name.to_s =~ /(\w+)=/ self.parameters[$1] = args.first diff --git a/spec/mail/fields/content_disposition_field_spec.rb b/spec/mail/fields/content_disposition_field_spec.rb index 38f791b2a..af114d1fc 100644 --- a/spec/mail/fields/content_disposition_field_spec.rb +++ b/spec/mail/fields/content_disposition_field_spec.rb @@ -109,5 +109,11 @@ c = Mail::ContentDispositionField.new(string) expect(c.filename).to eq "Eelanalüüsi päring.jpg" end + + it "should accept with whitespace around equal sign" do + string = %q{attachment; name = mikel.jpg} + c = Mail::ContentDispositionField.new(string) + expect(c.filename).to eq 'mikel.jpg' + end end end diff --git a/spec/mail/fields/content_type_field_spec.rb b/spec/mail/fields/content_type_field_spec.rb index 5753faf17..291c1e111 100644 --- a/spec/mail/fields/content_type_field_spec.rb +++ b/spec/mail/fields/content_type_field_spec.rb @@ -661,6 +661,11 @@ expect(c.encoded).to eq result end + it "should accept with whitespace around equal sign" do + string = %q{application/octet-stream; filename = mikel.jpg} + c = Mail::ContentTypeField.new(string) + expect(c.filename).to eq 'mikel.jpg' + end end describe "handling badly formated content-type fields" do