summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxibbar <xibbar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-24 07:25:53 +0000
committerxibbar <xibbar@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-10-24 07:25:53 +0000
commit86560b12eeccdfe16550b6907096235cd4b6046e (patch)
tree5c4d7a8c10453119cccebe995619e62d8459a842
parent9e1bddfda25d9490af078c273084fc61074ccfe6 (diff)
* 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
-rw-r--r--ChangeLog8
-rw-r--r--lib/cgi/core.rb24
-rwxr-xr-xtest/cgi/test_cgi_multipart.rb28
3 files changed, 53 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index c08ae16144..3ac40ff52d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
* common.mk (ext): split out the target for extension library.
diff --git a/lib/cgi/core.rb b/lib/cgi/core.rb
index 3a934c928b..87c4f68540 100644
--- a/lib/cgi/core.rb
+++ b/lib/cgi/core.rb
@@ -406,6 +406,9 @@ class CGI
# values is an Array.
attr_reader :params
+ # Get the uploaed files as a hash of name=>values pairs
+ attr_reader :files
+
# Set all the parameters.
def params=(hash)
@params.clear
@@ -422,6 +425,7 @@ class CGI
raise EOFError.new("bad content body") unless first_line == status
## parse and set params
params = {}
+ @files = {}
boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
boundary_end = nil
@@ -482,7 +486,25 @@ class CGI
## query parameter name
/Content-Disposition:.* name=(?:"(.*?)"|([^;\r\n]*))/i.match(head)
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 if buf.size == 0
break if content_length == -1
diff --git a/test/cgi/test_cgi_multipart.rb b/test/cgi/test_cgi_multipart.rb
index ce8a82e0a9..405d3ff457 100755
--- a/test/cgi/test_cgi_multipart.rb
+++ b/test/cgi/test_cgi_multipart.rb
@@ -31,7 +31,8 @@ class MultiPart
def initialize(boundary=nil)
@boundary = boundary || create_boundary()
- @buf = ''.force_encoding("ascii-8bit")
+ @buf = ''
+ @buf.force_encoding("ascii-8bit") if RUBY_VERSION>="1.9"
end
attr_reader :boundary
@@ -43,7 +44,11 @@ class MultiPart
buf << "Content-Disposition: form-data: name=\"#{name}\"#{s}\r\n"
buf << "Content-Type: #{content_type}\r\n" if content_type
buf << "\r\n"
- buf << value
+ if RUBY_VERSION>="1.9"
+ buf << value.dup.force_encoding("ASCII-8BIT")
+ else
+ buf << value
+ end
buf << "\r\n"
return self
end
@@ -148,7 +153,18 @@ class CGIMultipartTest < Test::Unit::TestCase
@data.each do |hash|
name = hash[:name]
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_equal(expected, cgi[name].read())
assert_equal(hash[:filename] || '', cgi[name].original_filename) #if hash[:filename]
@@ -173,7 +189,7 @@ class CGIMultipartTest < Test::Unit::TestCase
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
@data = [
{: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'),
:filename=>'file1.html', :content_type=>'text/html'},
{:name=>'image1', :value=>_read('small.png'),
@@ -188,7 +204,7 @@ class CGIMultipartTest < Test::Unit::TestCase
@boundary = '----WebKitFormBoundaryAAfvAII+YL9102cX'
@data = [
{: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'),
:filename=>'file1.html', :content_type=>'text/html'},
{:name=>'image1', :value=>_read('large.png'),
@@ -279,7 +295,7 @@ class CGIMultipartTest < Test::Unit::TestCase
@boundary = '(.|\n)*'
@data = [
{: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'),
:filename=>'file1.html', :content_type=>'text/html'},
{:name=>'image1', :value=>_read('small.png'),