From: "NARUSE, Yui" Date: 2010-04-11T07:11:51+09:00 Subject: [ruby-dev:40950] Re: URI.decode_www_form("?a=b") (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\??(?[^=;&]*=[^;&]*(?:[;&][^=;&]*=[^;&]*)*)\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