[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]