Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions lib/mail/fields/content_disposition_field.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,32 @@

module Mail
class ContentDispositionField < StructuredField

FIELD_NAME = 'content-disposition'
CAPITALIZED_FIELD = 'Content-Disposition'

def initialize(value = nil, charset = 'utf-8')
self.charset = charset
ensure_filename_quoted(value)
super(CAPITALIZED_FIELD, strip_field(FIELD_NAME, value), charset)
self.parse
self
end

def parse(val = value)
unless val.blank?
@element = Mail::ContentDispositionElement.new(val)
end
end

def element
@element ||= Mail::ContentDispositionElement.new(value)
end

def disposition_type
element.disposition_type
end

def parameters
@parameters = ParameterHash.new
element.parameters.each { |p| @parameters.merge!(p) }
Expand All @@ -37,11 +37,11 @@ def parameters

def filename
case
when !parameters['filename'].blank?
when parameters['filename']
@filename = parameters['filename']
when !parameters['name'].blank?
when parameters['name']
@filename = parameters['name']
else
else
@filename = nil
end
@filename
Expand All @@ -56,7 +56,7 @@ def encoded
end
"#{CAPITALIZED_FIELD}: #{disposition_type}" + p
end

def decoded
if parameters.length > 0
p = "; #{parameters.decoded}"
Expand Down
39 changes: 39 additions & 0 deletions spec/mail/fields/content_disposition_field_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -79,4 +79,43 @@
end
end

describe "finding a filename" do

it "should locate a filename if there is a filename" do
string = %q{Content-Disposition: attachment; filename=mikel.jpg}
c = Mail::ContentDispositionField.new(string)
expect(c.filename).to eq 'mikel.jpg'
end

it "should locate a name if there is no filename" do
string = %q{Content-Disposition: attachment; name=mikel.jpg}
c = Mail::ContentDispositionField.new(string)
expect(c.filename).to eq 'mikel.jpg'
end

it "should return an empty string when filename or name is empty" do
string = %q{Content-Disposition: attachment; filename=""}
c = Mail::ContentDispositionField.new(string)
expect(c.filename).to eq ''

string = %q{Content-Disposition: attachment; name=""}
c = Mail::ContentDispositionField.new(string)
expect(c.filename).to eq ''
end

it "should locate an encoded name as a filename" do
string = %q{Content-Disposition: attachment; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%91at.%20Pitbull.mp3}
c = Mail::ContentDispositionField.new(string)
if RUBY_VERSION >= '1.9'
expected = "01 Quien Te Dij\221at. Pitbull.mp3".force_encoding(Encoding::BINARY)
result = c.filename.force_encoding(Encoding::BINARY)
else
expected = "01 Quien Te Dij\221at. Pitbull.mp3"
result = c.filename
end
expect(expected).to eq result
end

end

end
10 changes: 10 additions & 0 deletions spec/mail/fields/content_type_field_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,16 @@
expect(c.filename).to eq 'mikel.jpg'
end

it "should return an empty string when filename or name is empty" do
string = %q{application/octet-stream; filename=""}
c = Mail::ContentTypeField.new(string)
expect(c.filename).to eq ''

string = %q{application/octet-stream; name=""}
c = Mail::ContentTypeField.new(string)
expect(c.filename).to eq ''
end

it "should locate an encoded name as a filename" do
string = %q{application/octet-stream; name*=iso-2022-jp'ja'01%20Quien%20Te%20Dij%91at.%20Pitbull.mp3}
c = Mail::ContentTypeField.new(string)
Expand Down