* lib/cgi/core.rb (read_multipart): change field value as String
from StringIO of Tempfile when multipart parse without file field. add files method that can uploaded files. [ruby-dev:36547] * test/cgi/test_cgi_multipart.rb: fix the test for core.rb. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19906 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9e1bddfda2
commit
86560b12ee
@ -1,3 +1,11 @@
|
|||||||
|
Fri Oct 24 16:13:12 2008 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/cgi/core.rb (read_multipart): change field value as String
|
||||||
|
from StringIO of Tempfile when multipart parse without file field.
|
||||||
|
add files method that can uploaded files. [ruby-dev:36547]
|
||||||
|
|
||||||
|
* test/cgi/test_cgi_multipart.rb: fix the test for core.rb.
|
||||||
|
|
||||||
Fri Oct 24 14:22:48 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Oct 24 14:22:48 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* common.mk (ext): split out the target for extension library.
|
* common.mk (ext): split out the target for extension library.
|
||||||
|
@ -406,6 +406,9 @@ class CGI
|
|||||||
# values is an Array.
|
# values is an Array.
|
||||||
attr_reader :params
|
attr_reader :params
|
||||||
|
|
||||||
|
# Get the uploaed files as a hash of name=>values pairs
|
||||||
|
attr_reader :files
|
||||||
|
|
||||||
# Set all the parameters.
|
# Set all the parameters.
|
||||||
def params=(hash)
|
def params=(hash)
|
||||||
@params.clear
|
@params.clear
|
||||||
@ -422,6 +425,7 @@ class CGI
|
|||||||
raise EOFError.new("bad content body") unless first_line == status
|
raise EOFError.new("bad content body") unless first_line == status
|
||||||
## parse and set params
|
## parse and set params
|
||||||
params = {}
|
params = {}
|
||||||
|
@files = {}
|
||||||
boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
|
boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
|
||||||
boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
|
boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
|
||||||
boundary_end = nil
|
boundary_end = nil
|
||||||
@ -482,7 +486,25 @@ class CGI
|
|||||||
## query parameter name
|
## query parameter name
|
||||||
/Content-Disposition:.* name=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
|
/Content-Disposition:.* name=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
|
||||||
name = $1 || $2 || ''
|
name = $1 || $2 || ''
|
||||||
(params[name] ||= []) << body
|
if body.original_filename.empty?
|
||||||
|
value=body.read.dup.force_encoding(@accept_charset)
|
||||||
|
(params[name] ||= []) << value
|
||||||
|
unless value.valid_encoding?
|
||||||
|
if @accept_charset_error_block
|
||||||
|
@accept_charset_error_block.call(name,value)
|
||||||
|
else
|
||||||
|
raise InvalidEncoding,"Accept-Charset encoding error"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class << params[name].last;self;end.class_eval do
|
||||||
|
define_method(:read){self}
|
||||||
|
define_method(:original_filename){""}
|
||||||
|
define_method(:content_type){""}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
(params[name] ||= []) << body
|
||||||
|
@files[name]=body
|
||||||
|
end
|
||||||
## break loop
|
## break loop
|
||||||
break if buf.size == 0
|
break if buf.size == 0
|
||||||
break if content_length == -1
|
break if content_length == -1
|
||||||
|
@ -31,7 +31,8 @@ class MultiPart
|
|||||||
|
|
||||||
def initialize(boundary=nil)
|
def initialize(boundary=nil)
|
||||||
@boundary = boundary || create_boundary()
|
@boundary = boundary || create_boundary()
|
||||||
@buf = ''.force_encoding("ascii-8bit")
|
@buf = ''
|
||||||
|
@buf.force_encoding("ascii-8bit") if RUBY_VERSION>="1.9"
|
||||||
end
|
end
|
||||||
attr_reader :boundary
|
attr_reader :boundary
|
||||||
|
|
||||||
@ -43,7 +44,11 @@ class MultiPart
|
|||||||
buf << "Content-Disposition: form-data: name=\"#{name}\"#{s}\r\n"
|
buf << "Content-Disposition: form-data: name=\"#{name}\"#{s}\r\n"
|
||||||
buf << "Content-Type: #{content_type}\r\n" if content_type
|
buf << "Content-Type: #{content_type}\r\n" if content_type
|
||||||
buf << "\r\n"
|
buf << "\r\n"
|
||||||
buf << value
|
if RUBY_VERSION>="1.9"
|
||||||
|
buf << value.dup.force_encoding("ASCII-8BIT")
|
||||||
|
else
|
||||||
|
buf << value
|
||||||
|
end
|
||||||
buf << "\r\n"
|
buf << "\r\n"
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@ -148,7 +153,18 @@ class CGIMultipartTest < Test::Unit::TestCase
|
|||||||
@data.each do |hash|
|
@data.each do |hash|
|
||||||
name = hash[:name]
|
name = hash[:name]
|
||||||
expected = hash[:value]
|
expected = hash[:value]
|
||||||
expected_class = @expected_class || (hash[:value].length < threshold ? StringIO : Tempfile)
|
if RUBY_VERSION>="1.9"
|
||||||
|
if hash[:filename] #if file
|
||||||
|
expected_class = @expected_class || (hash[:value].length < threshold ? StringIO : Tempfile)
|
||||||
|
assert(cgi.files.keys.member?(hash[:name]))
|
||||||
|
else
|
||||||
|
expected_class = String
|
||||||
|
assert_equal(expected, cgi[name])
|
||||||
|
assert_equal(false,cgi.files.keys.member?(hash[:name]))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
expected_class = @expected_class || (hash[:value].length < threshold ? StringIO : Tempfile)
|
||||||
|
end
|
||||||
assert_kind_of(expected_class, cgi[name])
|
assert_kind_of(expected_class, cgi[name])
|
||||||
assert_equal(expected, cgi[name].read())
|
assert_equal(expected, cgi[name].read())
|
||||||
assert_equal(hash[:filename] || '', cgi[name].original_filename) #if hash[:filename]
|
assert_equal(hash[:filename] || '', cgi[name].original_filename) #if hash[:filename]
|
||||||
@ -173,7 +189,7 @@ class CGIMultipartTest < Test::Unit::TestCase
|
|||||||
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
|
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
|
||||||
@data = [
|
@data = [
|
||||||
{:name=>'hidden1', :value=>'foobar'},
|
{:name=>'hidden1', :value=>'foobar'},
|
||||||
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A"},
|
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A".force_encoding("UTF-8")},
|
||||||
{:name=>'file1', :value=>_read('file1.html'),
|
{:name=>'file1', :value=>_read('file1.html'),
|
||||||
:filename=>'file1.html', :content_type=>'text/html'},
|
:filename=>'file1.html', :content_type=>'text/html'},
|
||||||
{:name=>'image1', :value=>_read('small.png'),
|
{:name=>'image1', :value=>_read('small.png'),
|
||||||
@ -188,7 +204,7 @@ class CGIMultipartTest < Test::Unit::TestCase
|
|||||||
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
|
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
|
||||||
@data = [
|
@data = [
|
||||||
{:name=>'hidden1', :value=>'foobar'},
|
{:name=>'hidden1', :value=>'foobar'},
|
||||||
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A"},
|
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A".force_encoding("UTF-8")},
|
||||||
{:name=>'file1', :value=>_read('file1.html'),
|
{:name=>'file1', :value=>_read('file1.html'),
|
||||||
:filename=>'file1.html', :content_type=>'text/html'},
|
:filename=>'file1.html', :content_type=>'text/html'},
|
||||||
{:name=>'image1', :value=>_read('large.png'),
|
{:name=>'image1', :value=>_read('large.png'),
|
||||||
@ -279,7 +295,7 @@ class CGIMultipartTest < Test::Unit::TestCase
|
|||||||
@boundary = '(.|\n)*'
|
@boundary = '(.|\n)*'
|
||||||
@data = [
|
@data = [
|
||||||
{:name=>'hidden1', :value=>'foobar'},
|
{:name=>'hidden1', :value=>'foobar'},
|
||||||
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A"},
|
{:name=>'text1', :value=>"\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A".force_encoding("UTF-8")},
|
||||||
{:name=>'file1', :value=>_read('file1.html'),
|
{:name=>'file1', :value=>_read('file1.html'),
|
||||||
:filename=>'file1.html', :content_type=>'text/html'},
|
:filename=>'file1.html', :content_type=>'text/html'},
|
||||||
{:name=>'image1', :value=>_read('small.png'),
|
{:name=>'image1', :value=>_read('small.png'),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user