mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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
This commit is contained in:
parent
d5528ec358
commit
1362d81a22
2 changed files with 27 additions and 0 deletions
|
@ -479,10 +479,12 @@ class CGI
|
||||||
bufsize = 10 * 1024
|
bufsize = 10 * 1024
|
||||||
max_count = MAX_MULTIPART_COUNT
|
max_count = MAX_MULTIPART_COUNT
|
||||||
n = 0
|
n = 0
|
||||||
|
tempfiles = []
|
||||||
while true
|
while true
|
||||||
(n += 1) < max_count or raise StandardError.new("too many parameters.")
|
(n += 1) < max_count or raise StandardError.new("too many parameters.")
|
||||||
## create body (StringIO or Tempfile)
|
## create body (StringIO or Tempfile)
|
||||||
body = create_body(bufsize < content_length)
|
body = create_body(bufsize < content_length)
|
||||||
|
tempfiles << body if body.kind_of? Tempfile
|
||||||
class << body
|
class << body
|
||||||
if method_defined?(:path)
|
if method_defined?(:path)
|
||||||
alias local_path path
|
alias local_path path
|
||||||
|
@ -540,6 +542,7 @@ class CGI
|
||||||
name = $1 || $2 || ''
|
name = $1 || $2 || ''
|
||||||
if body.original_filename.empty?
|
if body.original_filename.empty?
|
||||||
value=body.read.dup.force_encoding(@accept_charset)
|
value=body.read.dup.force_encoding(@accept_charset)
|
||||||
|
body.unlink if body.kind_of? Tempfile
|
||||||
(params[name] ||= []) << value
|
(params[name] ||= []) << value
|
||||||
unless value.valid_encoding?
|
unless value.valid_encoding?
|
||||||
if @accept_charset_error_block
|
if @accept_charset_error_block
|
||||||
|
@ -563,6 +566,14 @@ class CGI
|
||||||
raise EOFError, "bad boundary end of body part" unless boundary_end =~ /--/
|
raise EOFError, "bad boundary end of body part" unless boundary_end =~ /--/
|
||||||
params.default = []
|
params.default = []
|
||||||
params
|
params
|
||||||
|
ensure
|
||||||
|
if $!
|
||||||
|
tempfiles.each {|t|
|
||||||
|
if t.path
|
||||||
|
t.unlink
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
end # read_multipart
|
end # read_multipart
|
||||||
private :read_multipart
|
private :read_multipart
|
||||||
def create_body(is_large) #:nodoc:
|
def create_body(is_large) #:nodoc:
|
||||||
|
|
|
@ -107,6 +107,7 @@ class CGIMultipartTest < Test::Unit::TestCase
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
ENV['REQUEST_METHOD'] = 'POST'
|
ENV['REQUEST_METHOD'] = 'POST'
|
||||||
|
@tempfiles = []
|
||||||
end
|
end
|
||||||
|
|
||||||
def teardown
|
def teardown
|
||||||
|
@ -115,6 +116,9 @@ class CGIMultipartTest < Test::Unit::TestCase
|
||||||
end
|
end
|
||||||
$stdin.close() if $stdin.is_a?(Tempfile)
|
$stdin.close() if $stdin.is_a?(Tempfile)
|
||||||
$stdin = STDIN
|
$stdin = STDIN
|
||||||
|
@tempfiles.each {|t|
|
||||||
|
t.unlink
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def _prepare(data)
|
def _prepare(data)
|
||||||
|
@ -133,6 +137,7 @@ class CGIMultipartTest < Test::Unit::TestCase
|
||||||
ENV['REQUEST_METHOD'] = 'POST'
|
ENV['REQUEST_METHOD'] = 'POST'
|
||||||
## set $stdin
|
## set $stdin
|
||||||
tmpfile = Tempfile.new('test_cgi_multipart')
|
tmpfile = Tempfile.new('test_cgi_multipart')
|
||||||
|
@tempfiles << tmpfile
|
||||||
tmpfile.binmode
|
tmpfile.binmode
|
||||||
tmpfile << input
|
tmpfile << input
|
||||||
tmpfile.rewind()
|
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[:filename] || '', cgi[name].original_filename) #if hash[:filename]
|
||||||
assert_equal(hash[:content_type] || '', cgi[name].content_type) #if hash[:content_type]
|
assert_equal(hash[:content_type] || '', cgi[name].content_type) #if hash[:content_type]
|
||||||
end
|
end
|
||||||
|
ensure
|
||||||
|
if cgi
|
||||||
|
cgi.params.each {|name, vals|
|
||||||
|
vals.each {|val|
|
||||||
|
if val.kind_of?(Tempfile) && val.path
|
||||||
|
val.unlink
|
||||||
|
end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
cgi = RUBY_VERSION>="1.9" ? CGI.new(:accept_charset=>"UTF-8") : CGI.new
|
||||||
assert_equal(cgi['foo'], 'bar')
|
assert_equal(cgi['foo'], 'bar')
|
||||||
assert_equal(cgi['file'].read, 'b'*10134)
|
assert_equal(cgi['file'].read, 'b'*10134)
|
||||||
|
cgi['file'].unlink if cgi['file'].kind_of? Tempfile
|
||||||
end
|
end
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
Loading…
Add table
Reference in a new issue