2007年12月 7日

[ruby-list:44327] cgi.rbでmultipartのときにcontent_typeに余計な"\r"がつく

桑田といいます。

Ruby1.8.6のcgi.rbで、multipartのときにcontent_typeに "\r" が
含まれてしまいます。おそらくバグだと思いますので報告します。

次が再現コードです。最後の p cgi['file1'].content_type は
"text/html" が期待されますが、実際には "text/html\r" となり、
末尾に余計な "\r" が含まれてしまいます。


--------------------
boundary = 'boundary123456789'
s = ''
s << "--#{boundary}\r\n"
s << "Content-Disposition: form-data: name=\"file1\";
filename=\"file.html\"\r\n"
s << "Content-Type: text/html\r\n"
s << "\r\n"
s << "<html><body><h1>Hello</h1></body></html>\n"
s << "\r\n"
s << "--#{boundary}--\r\n"

require 'cgi'
require 'stringio'
$stdin = StringIO.new(s)
ENV['REQUEST_METHOD'] = 'POST'
ENV['CONTENT_TYPE'] = "multipart/form-data; boundary=#{boundary}"
ENV['CONTENT_LENGTH'] = s.length.to_s
cgi = CGI.new
p cgi['file1'].content_type # expected:"text/html", actual:"text/html\r"
--------------------


以下がパッチです。

index: lib/cgi.rb
======================================================================
--- /usr/local/lib/ruby/1.8/cgi.rb 2007-05-23 06:58:09.000000000 +0900
+++ lib/cgi.rb 2007-12-07 19:21:03.000000000 +0900
@@ -1046,10 +1046,11 @@
filename = CGI::unescape(filename)
end

/Content-Type: (.*)/ni.match(head)
content_type = ($1 or "")
+ content_type.chomp!

(class << body; self; end).class_eval do
alias local_path path
define_method(:original_filename) {filename.dup.taint}
define_method(:content_type) {content_type.dup.taint}
======================================================================


以上です。

--
makoto kuwata

投稿者 xml-rpc : 2007年12月 7日 22:28
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/67408
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。