Skip to content

Commit

Permalink
fix invalid characters in multipart uploads
Browse files Browse the repository at this point in the history
  • Loading branch information
mraidel committed Apr 20, 2013
1 parent 0722c99 commit b61d33c
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/rack/multipart/parser.rb
Expand Up @@ -137,6 +137,9 @@ def get_filename(head)
if filename && filename.scan(/%.?.?/).all? { |s| s =~ /%[0-9a-fA-F]{2}/ }
filename = Utils.unescape(filename)
end
if filename && String.method_defined?(:valid_encoding?) && !filename.valid_encoding?
filename = filename.chars.select { |char| char.valid_encoding? }.join
end
if filename && filename !~ /\\[^\\"]/
filename = filename.gsub(/\\(.)/, '\1')
end
Expand Down
6 changes: 6 additions & 0 deletions test/multipart/invalid_character
@@ -0,0 +1,6 @@
--AaB03x
Content-Disposition: form-data; name="files"; filename="invalid�.txt"
Content-Type: text/plain

contents
--AaB03x--
14 changes: 14 additions & 0 deletions test/spec_multipart.rb
Expand Up @@ -166,6 +166,20 @@ def rd.length
params["files"][:tempfile].read.should.equal "contents"
end

should "parse multipart upload with filename with invalid characters" do
env = Rack::MockRequest.env_for("/", multipart_fixture(:invalid_character))
params = Rack::Multipart.parse_multipart(env)
params["files"][:type].should.equal "text/plain"
params["files"][:filename].should.match(/invalid/)
head = "Content-Disposition: form-data; " +
"name=\"files\"; filename=\"invalid\xC3.txt\"\r\n" +
"Content-Type: text/plain\r\n"
head = head.force_encoding("ASCII-8BIT") if head.respond_to?(:force_encoding)
params["files"][:head].should.equal head
params["files"][:name].should.equal "files"
params["files"][:tempfile].read.should.equal "contents"
end

should "not include file params if no file was selected" do
env = Rack::MockRequest.env_for("/", multipart_fixture(:none))
params = Rack::Multipart.parse_multipart(env)
Expand Down

0 comments on commit b61d33c

Please sign in to comment.