From: Yusuke ENDOH Date: 2010-01-27T23:47:09+09:00 Subject: [ruby-dev:40195] regression of CGI.parse xibbar さん 遠藤です。 r19613 で、無効な QUERY_STRING を受け取った時の処理が加わりましたが ([ruby-dev:36618]) 、この影響で以下の動作が変わっています。 $ ./ruby -v -rcgi -e 'p CGI.parse("one=a&two=b&two=c&three")' ruby 1.9.2dev (2010-01-27 trunk 26441) [i686-linux] {"one"=>["a"], "two"=>["b", "c"], "three"=>[]} $ ruby18 -v -rcgi -e 'p CGI.parse("one=a&two=b&two=c&three")' ruby 1.8.8dev (2010-01-26 revision 26430) [i686-linux] {"three"=>[nil], "two"=>["b", "c"], "one"=>["a"]} つまり、value のないキーの値が [nil] から [] になりました。この変更 自体を意図した仕様変更ではないと思ったので報告します。 まあどっちの動作でもいいとは思うのですが、どっちでもいいなら仕様変更 しない方がいいかなと思います。rubyspec も失敗していることですし。 ですが 1.9.1 には入ってしまっているので、もしこれで行くと言うことなら rubyspec 側に修正をお願いしようと思います。 diff --git a/lib/cgi/core.rb b/lib/cgi/core.rb index 3930663..85f4761 100644 --- a/lib/cgi/core.rb +++ b/lib/cgi/core.rb @@ -337,11 +337,7 @@ class CGI params = {} query.split(/[&;]/).each do |pairs| key, value = pairs.split('=',2).collect{|v| CGI::unescape(v) } - if key && value - params.has_key?(key) ? params[key].push(value) : params[key] = [value] - elsif key - params[key]=[] - end + params.has_key?(key) ? params[key].push(value) : params[key] = [value] if key end params.default=[].freeze params @@ -497,7 +493,7 @@ class CGI if body.original_filename.empty? value=body.read.dup.force_encoding(@accept_charset) (params[name] ||= []) << value - unless value.valid_encoding? + if value && !value.valid_encoding? if @accept_charset_error_block @accept_charset_error_block.call(name,value) else @@ -606,7 +602,7 @@ class CGI unless Encoding.find(@accept_charset) == Encoding::ASCII_8BIT @params.each do |key,values| values.each do |value| - unless value.valid_encoding? + if value && !value.valid_encoding? if @accept_charset_error_block @accept_charset_error_block.call(key,value) -- Yusuke ENDOH