Class: CGI::Cookie

Inherits:
Array show all
Defined in:
lib/action_controller/cgi_ext/cookie_performance_fix.rb

Overview

This is a cookie class that fixes the performance problems with the default one that ships with 1.8.1 and below. It replaces the inheritance on SimpleDelegator with DelegateClass(Array) following the suggestion from Matz on groups.google.com/groups?th=e3a4e68ba042f842&seekm=c3sioe%241qvm%241%40news.cybercity.dk#link14

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name = "", *value) ⇒ Cookie

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.

These keywords correspond to attributes of the cookie object.



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 26

def initialize(name = "", *value)
  options = if name.kind_of?(String)
              { "name" => name, "value" => value }
            else
              name
            end
  unless options.has_key?("name")
    raise ArgumentError, "`name' required"
  end

  @name = options["name"]
  @value = Array(options["value"])
  # simple support for IE
  if options["path"]
    @path = options["path"]
  else
    %r|^(.*/)|.match(ENV["SCRIPT_NAME"])
    @path = ($1 or "")
  end
  @domain = options["domain"]
  @expires = options["expires"]
  @secure = options["secure"] == true ? true : false

  super(@value)
end

Instance Attribute Details

#domainObject

Returns the value of attribute domain.



56
57
58
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 56

def domain
  @domain
end

#expiresObject

Returns the value of attribute expires.



56
57
58
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 56

def expires
  @expires
end

#nameObject

Returns the value of attribute name.



56
57
58
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 56

def name
  @name
end

#pathObject

Returns the value of attribute path.



56
57
58
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 56

def path
  @path
end

#secureObject

Returns the value of attribute secure.



57
58
59
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 57

def secure
  @secure
end

#valueObject

Returns the value of attribute value.



56
57
58
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 56

def value
  @value
end

Class Method Details

.parse(raw_cookie) ⇒ Object

Parse a raw cookie string into a hash of cookie-name=>Cookie pairs.

cookies = CGI::Cookie::parse("raw_cookie_string")
  # { "name1" => cookie1, "name2" => cookie2, ... }


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 103

def self.parse(raw_cookie)
  cookies = Hash.new([])
  return cookies unless raw_cookie

  raw_cookie.split(/; /).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) }
    unless cookies.has_key?(name)
      cookies[name] = new({ "name" => name, "value" => values })
    end
  end

  cookies
end

Instance Method Details

#__setobj__(obj) ⇒ Object



52
53
54
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 52

def __setobj__(obj)
  @_dc_obj = obj
end

#to_sObject

Convert the Cookie to its string representation.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 68

def to_s
  buf = ""
  buf += @name + '='

  if @value.kind_of?(String)
    buf += CGI::escape(@value)
  else
    buf += @value.collect{|v| CGI::escape(v) }.join("&")
  end

  if @domain
    buf += '; domain=' + @domain
  end

  if @path
    buf += '; path=' + @path
  end

  if @expires
    buf += '; expires=' + CGI::rfc1123_date(@expires)
  end

  if @secure == true
    buf += '; secure'
  end

  buf
end