Skip to content

Instantly share code, notes, and snippets.

@ryantm
Created July 23, 2008 17:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ryantm/1824 to your computer and use it in GitHub Desktop.
Save ryantm/1824 to your computer and use it in GitHub Desktop.
ryan@rtmlap:~/rb/code/test$ ruby ~/test.rb
The Cookies:
phpbb3_q3k1i_u=1; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_k=; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_sid=3c2ab8dae46098004b66dcd2ff6c3180; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_u=1000; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_k=c06c23e2a199173a; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_sid=85d32e487ffd5bc8fad948e327866597; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly
Ruby says:
{"phpbb3_q3k1i_sid"=>["3c2ab8dae46098004b66dcd2ff6c3180", "85d32e487ffd5bc8fad948e327866597"], "expires"=>["Thu", "Thu", "Thu", "Thu", "Thu", "Thu"], "domain"=>[".brawlsnapshots.com", ".brawlsnapshots.com", ".brawlsnapshots.com", ".brawlsnapshots.com", ".brawlsnapshots.com", ".brawlsnapshots.com"], "phpbb3_q3k1i_u"=>["1", "1000"], "phpbb3_q3k1i_k"=>["c06c23e2a199173a"], "path"=>["/", "/", "/", "/", "/", "/"]}
Rails says:
{"phpbb3_q3k1i_sid"=>["3c2ab8dae46098004b66dcd2ff6c3180"], "expires"=>["Thu"], "domain"=>[".brawlsnapshots.com"], "phpbb3_q3k1i_u"=>["1"], "phpbb3_q3k1i_k"=>[], "path"=>["/"]}
require 'cgi'
# File lib/cgi.rb, line 875
# 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) }
# if cookies.has_key?(name)
# values = cookies[name].value + values
# end
# cookies[name] = Cookie::new(name, *values)
# end
# cookies
# end
asetcookie = "phpbb3_q3k1i_u=1; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_k=; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_sid=3c2ab8dae46098004b66dcd2ff6c3180; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_u=1000; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_k=c06c23e2a199173a; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly, phpbb3_q3k1i_sid=85d32e487ffd5bc8fad948e327866597; expires=Thu, 23-Jul-2009 17:27:04 GMT; path=/; domain=.brawlsnapshots.com; HttpOnly"
puts "The Cookies:"
puts asetcookie
puts "Ruby says:"
puts CGI::Cookie::parse(asetcookie).inspect
CGI.module_eval { remove_const "Cookie" }
# TODO: document how this differs from stdlib CGI::Cookie
class CGI #:nodoc:
class Cookie < DelegateClass(Array)
attr_accessor :name, :value, :path, :domain, :expires
attr_reader :secure, :http_only
# Create a new CGI::Cookie object.
#
# The contents of the cookie can be specified as a +name+ and one
# or more +value+ arguments. Alternatively, the contents can
# be specified as a single hash argument. The possible keywords of
# this hash are as follows:
#
# name:: the name of the cookie. Required.
# value:: the cookie's value or list of values.
# path:: the path for which this cookie applies. Defaults to the
# base directory of the CGI script.
# domain:: the domain for which this cookie applies.
# expires:: the time at which this cookie expires, as a +Time+ object.
# secure:: whether this cookie is a secure cookie or not (default to
# false). Secure cookies are only transmitted to HTTPS
# servers.
# http_only:: whether this cookie can be accessed by client side scripts (e.g. document.cookie) or only over HTTP
# More details: http://msdn2.microsoft.com/en-us/library/system.web.httpcookie.httponly.aspx
# Defaults to false.
# These keywords correspond to attributes of the cookie object.
def initialize(name = '', *value)
if name.kind_of?(String)
@name = name
@value = Array(value)
@domain = nil
@expires = nil
@secure = false
@http_only = false
@path = nil
else
@name = name['name']
@value = Array(name['value'])
@domain = name['domain']
@expires = name['expires']
@secure = name['secure'] || false
@http_only = name['http_only'] || false
@path = name['path']
end
raise ArgumentError, "`name' required" unless @name
# simple support for IE
unless @path
%r|^(.*/)|.match(ENV['SCRIPT_NAME'])
@path = ($1 or '')
end
super(@value)
end
# Set whether the Cookie is a secure cookie or not.
def secure=(val)
@secure = val == true
end
# Set whether the Cookie is an HTTP only cookie or not.
def http_only=(val)
@http_only = val == true
end
# Convert the Cookie to its string representation.
def to_s
buf = ''
buf << @name << '='
buf << (@value.kind_of?(String) ? CGI::escape(@value) : @value.collect{|v| CGI::escape(v) }.join("&"))
buf << '; domain=' << @domain if @domain
buf << '; path=' << @path if @path
buf << '; expires=' << CGI::rfc1123_date(@expires) if @expires
buf << '; secure' if @secure
buf << '; HttpOnly' if @http_only
buf
end
# 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 self.parse(raw_cookie)
cookies = Hash.new([])
if 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.split('&').collect!{|v| CGI::unescape(v) }
unless cookies.has_key?(name)
cookies[name] = new(name, *values)
end
end
end
cookies
end
end # class Cookie
end
puts "Rails says:"
puts CGI::Cookie::parse(asetcookie).inspect
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment