summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxibbar <xibbar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-05 00:57:45 +0000
committerxibbar <xibbar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-05 00:57:45 +0000
commit1362d81a22ab179c1286a61b8d5a54e59784458e (patch)
tree44eec54663cd2129323dd1e2e61d9313b39ef571
parentd5528ec3580dba09ebbda819c7b10e25d5af5981 (diff)
Mon Nov 5 09:55:05 2012 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
* lib/cgi/core.rb: remove tempfile more early. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37471 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--lib/cgi/core.rb11
-rw-r--r--test/cgi/test_cgi_multipart.rb16
2 files changed, 27 insertions, 0 deletions
diff --git a/lib/cgi/core.rb b/lib/cgi/core.rb
index 63ab3c81d6..a9c9080b76 100644
--- a/lib/cgi/core.rb
+++ b/lib/cgi/core.rb
@@ -479,10 +479,12 @@ class CGI
bufsize = 10 * 1024
max_count = MAX_MULTIPART_COUNT
n = 0
+ tempfiles = []
while true
(n += 1) < max_count or raise StandardError.new("too many parameters.")
## create body (StringIO or Tempfile)
body = create_body(bufsize < content_length)
+ tempfiles << body if body.kind_of? Tempfile
class << body
if method_defined?(:path)
alias local_path path
@@ -540,6 +542,7 @@ class CGI
name = $1 || $2 || ''
if body.original_filename.empty?
value=body.read.dup.force_encoding(@accept_charset)
+ body.unlink if body.kind_of? Tempfile
(params[name] ||= []) << value
unless value.valid_encoding?
if @accept_charset_error_block
@@ -563,6 +566,14 @@ class CGI
raise EOFError, "bad boundary end of body part" unless boundary_end =~ /--/
params.default = []
params
+ ensure
+ if $!
+ tempfiles.each {|t|
+ if t.path
+ t.unlink
+ end
+ }
+ end
end # read_multipart
private :read_multipart
def create_body(is_large) #:nodoc:
diff --git a/test/cgi/test_cgi_multipart.rb b/test/cgi/test_cgi_multipart.rb
index e39003d7c3..62fcc8b0c5 100644
--- a/test/cgi/test_cgi_multipart.rb
+++ b/test/cgi/test_cgi_multipart.rb
@@ -107,6 +107,7 @@ class CGIMultipartTest < Test::Unit::TestCase
def setup
ENV['REQUEST_METHOD'] = 'POST'
+ @tempfiles = []
end
def teardown
@@ -115,6 +116,9 @@ class CGIMultipartTest < Test::Unit::TestCase
end
$stdin.close() if $stdin.is_a?(Tempfile)
$stdin = STDIN
+ @tempfiles.each {|t|
+ t.unlink
+ }
end
def _prepare(data)
@@ -133,6 +137,7 @@ class CGIMultipartTest < Test::Unit::TestCase
ENV['REQUEST_METHOD'] = 'POST'
## set $stdin
tmpfile = Tempfile.new('test_cgi_multipart')
+ @tempfiles << tmpfile
tmpfile.binmode
tmpfile << input
tmpfile.rewind()
@@ -168,6 +173,16 @@ class CGIMultipartTest < Test::Unit::TestCase
assert_equal(hash[:filename] || '', cgi[name].original_filename) #if hash[:filename]
assert_equal(hash[:content_type] || '', cgi[name].content_type) #if hash[:content_type]
end
+ ensure
+ if cgi
+ cgi.params.each {|name, vals|
+ vals.each {|val|
+ if val.kind_of?(Tempfile) && val.path
+ val.unlink
+ end
+ }
+ }
+ end
end
@@ -314,6 +329,7 @@ class CGIMultipartTest < Test::Unit::TestCase
cgi = RUBY_VERSION>="1.9" ? CGI.new(:accept_charset=>"UTF-8") : CGI.new
assert_equal(cgi['foo'], 'bar')
assert_equal(cgi['file'].read, 'b'*10134)
+ cgi['file'].unlink if cgi['file'].kind_of? Tempfile
end
###