diff options
author | Gary Grossman <ggrossman@zendesk.com> | 2015-09-06 00:20:30 -0700 |
---|---|---|
committer | Gary Grossman <ggrossman@zendesk.com> | 2015-09-06 00:20:30 -0700 |
commit | 319dd6290c569e0519adc9b0dc290346833fa378 (patch) | |
tree | 7c529865902d8ea6abbc1b4316deb50286ac75c7 | |
parent | a46eae2345a00666ade983740ac27c79adc7bd70 (diff) | |
download | rack-319dd6290c569e0519adc9b0dc290346833fa378.tar.gz |
Fix bug in parsing of Content-Disposition header where an unquoted name at end-of-line sucked in the trailing newline.
-rw-r--r-- | lib/rack/multipart.rb | 2 | ||||
-rw-r--r-- | lib/rack/multipart/parser.rb | 1 | ||||
-rw-r--r-- | test/spec_multipart.rb | 20 |
3 files changed, 22 insertions, 1 deletions
diff --git a/lib/rack/multipart.rb b/lib/rack/multipart.rb index 12c3917b..cc2d6ebb 100644 --- a/lib/rack/multipart.rb +++ b/lib/rack/multipart.rb @@ -17,7 +17,7 @@ module Rack BROKEN_QUOTED = /^#{CONDISP}.*;\sfilename="(.*?)"(?:\s*$|\s*;\s*#{TOKEN}=)/i BROKEN_UNQUOTED = /^#{CONDISP}.*;\sfilename=(#{TOKEN})/i MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni - MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*\s+name="?([^\";]*)"?/ni + MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*\s+name=(#{TOKEN}|"[^\";]*")/ni MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni # Updated definitions from RFC 2231 ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]} diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb index 8196207c..bc0162b4 100644 --- a/lib/rack/multipart/parser.rb +++ b/lib/rack/multipart/parser.rb @@ -246,6 +246,7 @@ module Rack content_type = head[MULTIPART_CONTENT_TYPE, 1] name = head[MULTIPART_CONTENT_DISPOSITION, 1] || head[MULTIPART_CONTENT_ID, 1] + name.gsub!(/\A"|"\Z/, '') if name filename = get_filename(head) diff --git a/test/spec_multipart.rb b/test/spec_multipart.rb index cfe508c1..7f7e6856 100644 --- a/test/spec_multipart.rb +++ b/test/spec_multipart.rb @@ -606,6 +606,26 @@ contents\r params["file"][:filename].must_equal 'long' * 100 end + it "parse unquoted parameter values at end of line" do + data = <<-EOF +--AaB03x\r +Content-Type: text/plain\r +Content-Disposition: attachment; name=inline\r +\r +true\r +--AaB03x--\r + EOF + + options = { + "CONTENT_TYPE" => "multipart/form-data; boundary=AaB03x", + "CONTENT_LENGTH" => data.length.to_s, + :input => StringIO.new(data) + } + env = Rack::MockRequest.env_for("/", options) + params = Rack::Multipart.parse_multipart(env) + params["inline"].must_equal 'true' + end + it "support mixed case metadata" do file = multipart_file(:text) data = File.open(file, 'rb') { |io| io.read } |