Bug #6751 ยป cgi-tempfile.patch
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
|
||
###
|