gpt4 book ai didi

Ruby CGI::Cookie 原始 cookie 解析

转载 作者:数据小太阳 更新时间:2023-10-29 07:34:27 25 4
gpt4 key购买 nike

我希望能够在 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 实例的东西,除了你传递给它一个原始的 cookie 字符串:

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

我想不通的是如何从原始 cookie 字符串 Eloquent 地做到这一点。

编辑---

以下代码在~/.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

最佳答案

我刚刚遇到了同样的问题。 CGI::Cookie.new 无法使用 CGI::Cookie::parse 生成的内容,它们似乎无法像我们预期的那样相互补充那么。

快速搜索 gem ,我找到了 https://github.com/dwaite/cookiejar .看起来这个 gem 试图做很多事情,但至少它有代码来像我们期望的那样正确解析原始 cookie。我没有尝试去理解这个库,因为它似乎做了很多事情,而我实际上只关心“使用 cookie -> 修改它 -> 生成 cookie”。

我想到了这个快速技巧:

require 'cgi'
require 'cookiejar'

# Some sample
raw_cookie = "somecookie=some%7Cvalue; expires=Wed, 02 Apr 2014 13:36:50 GMT; path=/; domain=.somedomain.com"

parts = CookieJar::CookieValidation.parse_set_cookie raw_cookie
# Needs manual unescape
parts[:value] = CGI::unescape(parts[:value])
# Per spec, this name is different
parts[:expires] = parts[:expires_at]
# Remove old ones
parts.delete :expires_at
# CookieJar adds them always, remove
parts.delete :version
# Convert symbol keys to strings for GGI::Cookie
cookie = parts.inject(Hash.new) do |acc, (k,v)|
acc[k.to_s] = v
acc
end
puts CGI::Cookie.new(cookie).to_s
#=> somecookie=some%7Cvalue; domain=.somedomain.com; path=/; expires=Wed, 02 Apr 2014 13:36:50 GMT

我想这应该是一个 gem 的调用,它只用 cookie 做一件事并且做得很好:能够解析和生成原始 cookie 字符串。但老实说,问题域可能比我那样胡闹要复杂得多。

关于Ruby CGI::Cookie 原始 cookie 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13399600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com