From 82a952e0dc0cc992019f3a37e2005a3b1847c02f Mon Sep 17 00:00:00 2001 From: Bob Potter Date: Sat, 1 Nov 2014 13:40:41 -0700 Subject: [PATCH 1/3] Improve performance of Message#find_attachment - Don't trigger exceptions for flow control. - Retrieve each header only once (at most). --- lib/mail/message.rb | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/lib/mail/message.rb b/lib/mail/message.rb index 5a4ece0de..239afd506 100644 --- a/lib/mail/message.rb +++ b/lib/mail/message.rb @@ -2118,23 +2118,30 @@ def init_with_string(string) # Returns the filename of the attachment (if it exists) or returns nil def find_attachment - content_type_name = header[:content_type].filename rescue nil - content_disp_name = header[:content_disposition].filename rescue nil - content_loc_name = header[:content_location].location rescue nil - case - when content_type && content_type_name - filename = content_type_name - when content_disposition && content_disp_name - filename = content_disp_name - when content_location && content_loc_name - filename = content_loc_name - else - filename = nil - end + filename = find_attachment_filename filename = Mail::Encodings.decode_encode(filename, :decode) if filename rescue filename filename end + def find_attachment_filename + content_type_header = header[:content_type] + if content_type_header && (filename = content_type_header.filename) + return filename + end + + content_disposition_header = header[:content_disposition] + if content_disposition_header && (filename = content_disposition_header.filename) + return filename + end + + content_location_header = header[:content_location] + if content_location_header && (filename = content_location_header.location) + return filename + end + + return nil + end + def do_delivery begin if perform_deliveries From 3d1dfe7ec341827d5037c1ae337ec5e4dc32d283 Mon Sep 17 00:00:00 2001 From: Bob Potter Date: Mon, 1 Dec 2014 18:15:56 -0800 Subject: [PATCH 2/3] Cleanup repetition in Message#find_attachment_filename --- lib/mail/message.rb | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/lib/mail/message.rb b/lib/mail/message.rb index 239afd506..5604c9904 100644 --- a/lib/mail/message.rb +++ b/lib/mail/message.rb @@ -2124,22 +2124,22 @@ def find_attachment end def find_attachment_filename - content_type_header = header[:content_type] - if content_type_header && (filename = content_type_header.filename) - return filename - end + filename_from_field(header[:content_type]) || + filename_from_field(header[:content_disposition]) || + filename_from_field(header[:content_location]) + end - content_disposition_header = header[:content_disposition] - if content_disposition_header && (filename = content_disposition_header.filename) - return filename - end + def filename_from_field(field) + return if field.nil? - content_location_header = header[:content_location] - if content_location_header && (filename = content_location_header.location) - return filename + case field.field + when ContentLocationField + field.location + when ContentTypeField, ContentDispositionField + field.filename + else + nil end - - return nil end def do_delivery From ea89891d399d65a1ff0700b8ca60252f072ca787 Mon Sep 17 00:00:00 2001 From: Bob Potter Date: Tue, 2 Dec 2014 09:07:11 -0800 Subject: [PATCH 3/3] Handle more field types --- lib/mail/message.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/mail/message.rb b/lib/mail/message.rb index 5604c9904..0d117a28d 100644 --- a/lib/mail/message.rb +++ b/lib/mail/message.rb @@ -2137,8 +2137,10 @@ def filename_from_field(field) field.location when ContentTypeField, ContentDispositionField field.filename - else + when NilClass, UnstructuredField nil + else + raise ArgumentError, "Don't know how to extract filename from #{field}" end end