ruby 1.9.3p194 (2012-04-20 リビジョン 35410) [x86_64-darwin10.8.0] で生の Cookie 文字列を解析できるようにしたい。
CGI::Cookieライブラリは有望に見えましたが、思ったようには機能しません。
例えば、
CGI::Cookie::parse("ASPSESSIONIDSCDRSRTS=HHALOHOBJGJMLPIANNLDOMCJ; path=/").each_key {|name| p 'Cookie name: ' + name}
戻ります:
"Cookie name: ASPSESSIONIDSCDRSRTS"
"Cookie name: path"
私が望むのはCGI::new
、生のクッキー文字列を渡すことを除いて、インスタンスが機能するようなものです:
cookie1 = CGI::Cookie::new('name' => 'name',
'value' => ['value1', 'value2', ...],
'path' => 'path', # optional
'domain' => 'domain', # optional
'expires' => Time.now, # optional
'secure' => true # optional
)
name = cookie1.name
values = cookie1.value
path = cookie1.path
domain = cookie1.domain
expires = cookie1.expires
secure = cookie1.secure
私が理解できないのは、生のクッキー文字列から雄弁にこれを行う方法です。
編集 - -
次のコードは~/.rvm/src/ruby-1.9.3-p194/lib/cgi/cookie.rb
ファイルにあります。したがって、以下のコメントのように返されるはずcookies[name] = Cookie::new(name, *values)
です。私が得ていないようです。
# Parse a raw cookie string into a hash of cookie-name=>Cookie
# pairs.
#
# cookies = CGI::Cookie::parse("raw_cookie_string")
# # { "name1" => cookie1, "name2" => cookie2, ... }
#
def Cookie::parse(raw_cookie)
cookies = Hash.new([])
return cookies unless raw_cookie
raw_cookie.split(/[;,]\s?/).each do |pairs|
name, values = pairs.split('=',2)
next unless name and values
name = CGI::unescape(name)
values ||= ""
values = values.split('&').collect{|v| CGI::unescape(v,@@accept_charset) }
if cookies.has_key?(name)
values = cookies[name].value + values
end
cookies[name] = Cookie::new(name, *values)
end
cookies
end
編集 - -
これは Ruby のCGI::Cookie.parse
メソッドのバグのようです。Ruby バグ トラッカーでバグ レポートを開きました - https://bugs.ruby-lang.org/issues/7364