From 0a644c0fb4d823ef5e16210573f308e2f7139e32 Mon Sep 17 00:00:00 2001 From: Joshua Peek Date: Tue, 20 Jan 2009 20:56:26 -0600 Subject: [PATCH] Don't create empty tempfile if no file was selected --- lib/rack/utils.rb | 5 ++++- test/multipart/empty | 10 ++++++++++ test/multipart/none | 9 +++++++++ test/spec_rack_utils.rb | 20 ++++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletions(-) create mode 100644 test/multipart/empty create mode 100644 test/multipart/none diff --git a/lib/rack/utils.rb b/lib/rack/utils.rb index 6017d0e..db82254 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -291,7 +291,10 @@ module Rack content_length = -1 if $1 == "--" end - if filename + if filename == "" + # filename is blank which means no file has been selected + data = nil + elsif filename body.rewind # Take the basename of the upload's original filename. diff --git a/test/multipart/empty b/test/multipart/empty new file mode 100644 index 0000000..f0f7983 --- /dev/null +++ b/test/multipart/empty @@ -0,0 +1,10 @@ +--AaB03x +Content-Disposition: form-data; name="submit-name" + +Larry +--AaB03x +Content-Disposition: form-data; name="files"; filename="file1.txt" +Content-Type: text/plain + + +--AaB03x-- diff --git a/test/multipart/none b/test/multipart/none new file mode 100644 index 0000000..d66f473 --- /dev/null +++ b/test/multipart/none @@ -0,0 +1,9 @@ +--AaB03x +Content-Disposition: form-data; name="submit-name" + +Larry +--AaB03x +Content-Disposition: form-data; name="files"; filename="" + + +--AaB03x-- diff --git a/test/spec_rack_utils.rb b/test/spec_rack_utils.rb index f16ac4c..73fa406 100644 --- a/test/spec_rack_utils.rb +++ b/test/spec_rack_utils.rb @@ -184,6 +184,26 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.length.should.equal 26473 end + specify "should parse multipart upload with empty file" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:empty)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["submit-name"].should.equal "Larry" + params["files"][:type].should.equal "text/plain" + params["files"][:filename].should.equal "file1.txt" + params["files"][:head].should.equal "Content-Disposition: form-data; " + + "name=\"files\"; filename=\"file1.txt\"\r\n" + + "Content-Type: text/plain\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "" + end + + specify "should not create empty an tempfile if no file was selected" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:none)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["submit-name"].should.equal "Larry" + params["files"].should.equal nil + end + specify "should parse IE multipart upload and clean up filename" do env = Rack::MockRequest.env_for("/", multipart_fixture(:ie)) params = Rack::Utils::Multipart.parse_multipart(env) -- 1.6.0.4