(2010/04/09 18:29), Tanaka Akira wrote:
> URI.decode_www_form は、引数の先頭にある ? を無視します。
> 
> % ./ruby -ruri -ve 'p URI.decode_www_form("?a=b")'
> ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux]
> [["a", "b"]]
> % ./ruby -ruri -ve 'p URI.decode_www_form("a=b")'
> ruby 1.9.2dev (2010-04-08 trunk 27262) [i686-linux]
> [["a", "b"]]
> 
> 意図は分かるんですが、残念なことに、URI の query には ? という文字を
> 入れられます。
> 
> RFC 3986:
> 
>        query       = *( pchar / "/" / "?" )
> 
> そのため、? で始まる key もちゃんと扱うにはどうするのか明瞭ではありません。
> ここは ? の特別扱いをあきらめたほうがいいんじゃないでしょうか。

どこかで form data の POST 時に ? を含めてしまう実装があるとか見たような
記憶があるんですが、見つからないので、そうしましょうか。

> あと、その
> 
>      unless /\A\??(?<query>[^=;&]*=[^;&]*(?:[;&][^=;&]*=[^;&]*)*)\z/ =~ str
> 
> というところで、[^;&]* というパターンが使われていて、
> 正しい application/x-www-form-urlencoded であることを検査していません。
> ちゃんと検査したほうがいい気がするんですがどうでしょうか。
> 
> % ./ruby -ruri -e 'p URI.decode_www_form("%=%")'
> [["%", "%"]]

「正しい application/x-www-form-urlencoded」がどの程度の範囲までなのかが
ちょっとよくわからないのですが、こんな感じですかねぇ。

  WFKV_ = '(?:%\h\h|[^%#=;&]+)' # :nodoc:
  def self.decode_www_form(str, enc=Encoding::UTF_8)
    return [] if str.empty?
    unless /\A#{WFKV_}*=#{WFKV_}*(?:[;&]#{WFKV_}*=#{WFKV_}*)*\z/o =~ str

-- 
NARUSE, Yui  <naruse / airemix.jp>