summary refs log tree commit
diff options
context:
space:
mode:
authorJames Tucker <jftucker@gmail.com>2014-07-18 15:58:59 -0700
committerJames Tucker <jftucker@gmail.com>2014-07-18 15:58:59 -0700
commit83155c586521455b43a9b05523b0e6d5318ba086 (patch)
tree7b7228252d9697e28143250e32dd04a267fc353c
parent975ccac7e56dcd765cb102016b97ef13d15feba8 (diff)
downloadrack-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.rb4
-rw-r--r--test/multipart/filename_and_no_name6
-rw-r--r--test/spec_multipart.rb12
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)