diff options
author | James Tucker <jftucker@gmail.com> | 2014-07-18 15:58:59 -0700 |
---|---|---|
committer | James Tucker <jftucker@gmail.com> | 2014-07-18 15:58:59 -0700 |
commit | 83155c586521455b43a9b05523b0e6d5318ba086 (patch) | |
tree | 7b7228252d9697e28143250e32dd04a267fc353c | |
parent | 975ccac7e56dcd765cb102016b97ef13d15feba8 (diff) | |
download | rack-83155c586521455b43a9b05523b0e6d5318ba086.tar.gz |
multipart/form-data with files with no input name
Closes #695. This is not technically specification correct, but it is included for compatibility with bad clients.
-rw-r--r-- | lib/rack/multipart/parser.rb | 4 | ||||
-rw-r--r-- | test/multipart/filename_and_no_name | 6 | ||||
-rw-r--r-- | test/spec_multipart.rb | 12 |
3 files changed, 22 insertions, 0 deletions
diff --git a/lib/rack/multipart/parser.rb b/lib/rack/multipart/parser.rb index 00e59ba7..22f9734b 100644 --- a/lib/rack/multipart/parser.rb +++ b/lib/rack/multipart/parser.rb @@ -112,6 +112,10 @@ module Rack filename = get_filename(head) + if name.nil? || name.empty? && filename + name = filename + end + if filename (@env['rack.tempfiles'] ||= []) << body = Tempfile.new("RackMultipart") body.binmode if body.respond_to?(:binmode) diff --git a/test/multipart/filename_and_no_name b/test/multipart/filename_and_no_name new file mode 100644 index 00000000..00d58153 --- /dev/null +++ b/test/multipart/filename_and_no_name @@ -0,0 +1,6 @@ +--AaB03x
+Content-Disposition: form-data; filename="file1.txt"
+Content-Type: text/plain
+
+contents
+--AaB03x--
diff --git a/test/spec_multipart.rb b/test/spec_multipart.rb index 8b453bea..2acb6e0d 100644 --- a/test/spec_multipart.rb +++ b/test/spec_multipart.rb @@ -153,6 +153,18 @@ describe Rack::Multipart do params["files"][:tempfile].read.should.equal "contents" end + should "parse multipart upload with text file with no name field" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_and_no_name)) + params = Rack::Multipart.parse_multipart(env) + params["file1.txt"][:type].should.equal "text/plain" + params["file1.txt"][:filename].should.equal "file1.txt" + params["file1.txt"][:head].should.equal "Content-Disposition: form-data; " + + "filename=\"file1.txt\"\r\n" + + "Content-Type: text/plain\r\n" + params["file1.txt"][:name].should.equal "file1.txt" + params["file1.txt"][:tempfile].read.should.equal "contents" + end + should "parse multipart upload with nested parameters" do env = Rack::MockRequest.env_for("/", multipart_fixture(:nested)) params = Rack::Multipart.parse_multipart(env) |