From a2a260012d0ab6c52d31f90205469af4b738598b 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 deletion(-) 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 6017d0e58..db8225491 100644 --- a/lib/rack/utils.rb +++ b/lib/rack/utils.rb @@ -291,7 +291,10 @@ def self.parse_multipart(env) 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 000000000..f0f79835c --- /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 000000000..d66f4730f --- /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 f16ac4ccd..73fa4066f 100644 --- a/test/spec_rack_utils.rb +++ b/test/spec_rack_utils.rb @@ -184,6 +184,26 @@ def context env, app=@app; app.call(env); end 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)