Ruby CGI :: Cookie原始cookie解析
我希望能够在
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字符串中雄辩地做到这一点. 编辑— 以下代码位于?/ .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 bug跟踪器的错误报告 – https://bugs.ruby-lang.org/issues/7364 解决方法
我只是遇到了同样的问题. CGI :: Cookie.new不能消耗CGI :: Cookie :: parse产生的东西,它们似乎没有像我们预期的那样相互补充.
快速搜索宝石我找到了https://github.com/dwaite/cookiejar.看起来这个宝石尝试做了很多,但至少它有代码来正确解析原始cookie,正如我们所期望的那样.我没有尝试理解这个库,因为它似乎做了很多东西,我实际上只关心“消费cookie – > modiyfing it – >生成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字符串.但TBH,问题领域可能要比我做的方式更加复杂. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |