ruby-changes:25414
From: xibbar <ko1@a...>
Date: Mon, 5 Nov 2012 09:58:31 +0900 (JST)
Subject: [ruby-changes:25414] xibbar:r37471 (trunk): * lib/cgi/core.rb: remove tempfile more early.
xibbar 2012-11-05 09:57:45 +0900 (Mon, 05 Nov 2012) New Revision: 37471 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=37471 Log: * lib/cgi/core.rb: remove tempfile more early. Modified files: trunk/lib/cgi/core.rb trunk/test/cgi/test_cgi_multipart.rb Index: lib/cgi/core.rb =================================================================== --- lib/cgi/core.rb (revision 37470) +++ lib/cgi/core.rb (revision 37471) @@ -479,10 +479,12 @@ 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 @@ 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 @@ 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: Index: test/cgi/test_cgi_multipart.rb =================================================================== --- test/cgi/test_cgi_multipart.rb (revision 37470) +++ test/cgi/test_cgi_multipart.rb (revision 37471) @@ -107,6 +107,7 @@ def setup ENV['REQUEST_METHOD'] = 'POST' + @tempfiles = [] end def teardown @@ -115,6 +116,9 @@ end $stdin.close() if $stdin.is_a?(Tempfile) $stdin = STDIN + @tempfiles.each {|t| + t.unlink + } end def _prepare(data) @@ -133,6 +137,7 @@ ENV['REQUEST_METHOD'] = 'POST' ## set $stdin tmpfile = Tempfile.new('test_cgi_multipart') + @tempfiles << tmpfile tmpfile.binmode tmpfile << input tmpfile.rewind() @@ -168,6 +173,16 @@ 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 @@ 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 ### -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/