Project

General

Profile

Bug #6751 ยป cgi-tempfile.patch

akr (Akira Tanaka), 07/18/2012 08:37 PM

View differences:

lib/cgi/core.rb (working copy)
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
......
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
......
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:
test/cgi/test_cgi_multipart.rb (working copy)
def setup
ENV['REQUEST_METHOD'] = 'POST'
@tempfiles = []
end
def teardown
......
end
$stdin.close() if $stdin.is_a?(Tempfile)
$stdin = STDIN
@tempfiles.each {|t|
t.unlink
}
end
def _prepare(data)
......
ENV['REQUEST_METHOD'] = 'POST'
## set $stdin
tmpfile = Tempfile.new('test_cgi_multipart')
@tempfiles << tmpfile
tmpfile.binmode
tmpfile << input
tmpfile.rewind()
......
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
......
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
###
    (1-1/1)