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
51
52
53
54
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 26

def initialize(name = '', *value)
  if name.kind_of?(String)
    @name = name
    @value = Array(value)
    @domain = nil
    @expires = nil
    @secure = false
    @path = nil
  else
    @name = name['name']
    @value = Array(name['value'])
    @domain = name['domain']
    @expires = name['expires']
    @secure = name['secure'] || false
    @path = name['path']
  end
  
  unless @name
    raise ArgumentError, "`name' required"
  end

  # simple support for IE
  unless @path
    %r|^(.*/)|.match(ENV['SCRIPT_NAME'])
    @path = ($1 or '')
  end

  super(@value)
end

Instance Attribute Details

#domainObject

Returns the value of attribute domain


60
61
62
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 60

def domain
  @domain
end

#expiresObject

Returns the value of attribute expires


60
61
62
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 60

def expires
  @expires
end

#nameObject

Returns the value of attribute name


60
61
62
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 60

def name
  @name
end

#pathObject

Returns the value of attribute path


60
61
62
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 60

def path
  @path
end

#secureObject

Returns the value of attribute secure


61
62
63
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 61

def secure
  @secure
end

#valueObject

Returns the value of attribute value


60
61
62
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 60

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, ... }

107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/action_controller/cgi_ext/cookie_performance_fix.rb', line 107

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

  if raw_cookie
    raw_cookie.split(/; /).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

Instance Method Details

#__setobj__(obj) ⇒ Object


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

def __setobj__(obj)
  @_dc_obj = obj
end

#to_sObject

Convert the Cookie to its string representation.


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

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