Class: CookieJar::Cookie

Inherits:
Object
  • Object
show all
Defined in:
lib/cookiejar/cookie.rb

Overview

Cookie is an immutable object which defines the data model of a HTTP Cookie. The data values within the cookie may be different from the values described in the literal cookie declaration. Specifically, the 'domain' and 'path' values may be set to defaults based on the requested resource that resulted in the cookie being set.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#commentObject (readonly)

String

RFC 2965 field for indicating comment (or a location)

describing the cookie to a usesr agent.



45
46
47
# File 'lib/cookiejar/cookie.rb', line 45

def comment
  @comment
end

#comment_urlObject (readonly)

String

RFC 2965 field for indicating comment (or a location)

describing the cookie to a usesr agent.



45
46
47
# File 'lib/cookiejar/cookie.rb', line 45

def comment_url
  @comment_url
end

#created_atObject (readonly)

Time

Time when this cookie was first evaluated and created.



53
54
55
# File 'lib/cookiejar/cookie.rb', line 53

def created_at
  @created_at
end

#discardObject (readonly)

Boolean

RFC 2965 field for indicating session lifetime for a cookie



47
48
49
# File 'lib/cookiejar/cookie.rb', line 47

def discard
  @discard
end

#domainObject (readonly)

String

The domain scope of the cookie. Follows the RFC 2965

'effective host' rules. A 'dot' prefix indicates that it applies both to the non-dotted domain and child domains, while no prefix indicates that only exact matches of the domain are in scope.



23
24
25
# File 'lib/cookiejar/cookie.rb', line 23

def domain
  @domain
end

#http_onlyObject (readonly)

Boolean

Popular browser extension to mark a cookie as invisible

to code running within the browser, such as JavaScript



37
38
39
# File 'lib/cookiejar/cookie.rb', line 37

def http_only
  @http_only
end

#nameObject (readonly)

String

The name of the cookie.



15
16
17
# File 'lib/cookiejar/cookie.rb', line 15

def name
  @name
end

#pathObject (readonly)

String

The path scope of the cookie. The cookie applies to URI paths

that prefix match this value.



27
28
29
# File 'lib/cookiejar/cookie.rb', line 27

def path
  @path
end

#portsObject (readonly)

Array<FixNum>, nil

RFC 2965 port scope for the cookie. If not nil,

indicates specific ports on the HTTP server which should receive this cookie if contacted.



51
52
53
# File 'lib/cookiejar/cookie.rb', line 51

def ports
  @ports
end

#secureObject (readonly)

Boolean

The secure flag is set to indicate that the cookie should

only be sent securely. Nearly all HTTP User Agent implementations assume this to mean that the cookie should only be sent over a SSL/TLS-protected connection



33
34
35
# File 'lib/cookiejar/cookie.rb', line 33

def secure
  @secure
end

#valueObject (readonly)

String

The value of the cookie, without any attempts at decoding.



17
18
19
# File 'lib/cookiejar/cookie.rb', line 17

def value
  @value
end

#versionObject (readonly)

Fixnum

Version indicator, currently either

  • 0 for netscape cookies

  • 1 for RFC 2965 cookies



42
43
44
# File 'lib/cookiejar/cookie.rb', line 42

def version
  @version
end

Class Method Details

.compute_search_domains(request_uri) ⇒ Array<String>

Compute the cookie search domains for a given request URI This will be the effective host of the request uri, along with any possibly matching dot-prefixed domains



239
240
241
# File 'lib/cookiejar/cookie.rb', line 239

def self.compute_search_domains request_uri
  CookieValidation.compute_search_domains request_uri
end

Create a cookie based on an absolute URI and the string value of a 'Set-Cookie' header.

This is used to fill in domain and port if missing from the cookie, and to perform appropriate validation.

Raises:



91
92
93
94
95
96
97
98
99
100
# File 'lib/cookiejar/cookie.rb', line 91

def self.from_set_cookie request_uri, set_cookie_value
  args = CookieJar::CookieValidation.parse_set_cookie set_cookie_value
  args[:domain] = CookieJar::CookieValidation.
                    determine_cookie_domain request_uri, args[:domain]
  args[:path] = CookieJar::CookieValidation.
                    determine_cookie_path request_uri, args[:path]
  cookie = Cookie.new args
  CookieJar::CookieValidation.validate_cookie request_uri, cookie
  cookie
end

.from_set_cookie2(request_uri, set_cookie_value) ⇒ Cookie

Create a cookie based on an absolute URI and the string value of a 'Set-Cookie2' header.

This is used to fill in domain and port if missing from the cookie, and to perform appropriate validation.

Raises:



111
112
113
114
115
116
117
118
119
120
# File 'lib/cookiejar/cookie.rb', line 111

def self.from_set_cookie2 request_uri, set_cookie_value
  args = CookieJar::CookieValidation.parse_set_cookie2 set_cookie_value
  args[:domain] = CookieJar::CookieValidation.
                    determine_cookie_domain request_uri, args[:domain]
  args[:path] = CookieJar::CookieValidation.
                    determine_cookie_path request_uri, args[:path]
  cookie = Cookie.new args
  CookieJar::CookieValidation.validate_cookie request_uri, cookie
  cookie
end

.json_create(o) ⇒ Cookie

Given a Hash representation of a JSON document, create a local cookie from the included data.



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
# File 'lib/cookiejar/cookie.rb', line 216

def self.json_create o
  params = o.inject({}) do |hash, (key, value)|
    hash[key.to_sym] = value
    hash
  end
  params[:version] ||= 0
  params[:created_at] = Time.parse params[:created_at]
  if params[:expiry].is_a? String
    params[:expires_at] = Time.parse params[:expiry]
  else
    params[:max_age] = params[:expiry]
  end
  params.delete :expiry

  self.new params
end

Instance Method Details

#decoded_valueObject



197
198
199
# File 'lib/cookiejar/cookie.rb', line 197

def decoded_value
  CookieJar::CookieValidation::decode_value value
end

#expired?(time = Time.now) ⇒ Boolean

Indicates whether the cookie is currently considered valid



71
72
73
# File 'lib/cookiejar/cookie.rb', line 71

def expired? (time = Time.now)
  expires_at != nil && time > expires_at
end

#expires_atTime?

Evaluate when this cookie will expire. Uses the original cookie fields for a max age or expires



59
60
61
62
63
64
65
# File 'lib/cookiejar/cookie.rb', line 59

def expires_at
  if @expiry.nil? || @expiry.is_a?(Time)
    @expiry
  else
    @created_at + @expiry
  end
end

#session?Boolean

Indicates whether the cookie will be considered invalid after the end of the current user session



78
79
80
# File 'lib/cookiejar/cookie.rb', line 78

def session?
  @expiry == nil || @discard
end

#should_send?(request_uri, script) ⇒ Boolean

Determine if a cookie should be sent given a request URI along with other options.

This currently ignores domain.

this cookie extension should be ignored



184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/cookiejar/cookie.rb', line 184

def should_send? request_uri, script
  uri = CookieJar::CookieValidation.to_uri request_uri
  # cookie path must start with the uri, it must not be a secure cookie
  # being sent over http, and it must not be a http_only cookie sent to
  # a script
  path_match   = uri.path.start_with? @path
  secure_match = !(@secure && uri.scheme == 'http')
  script_match = !(script && @http_only)
  expiry_match = !expired?
  ports_match = ports.nil? || (ports.include? uri.port)
  path_match && secure_match && script_match && expiry_match && ports_match
end

#to_hashObject

Return a hash representation of the cookie.



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/cookiejar/cookie.rb', line 150

def to_hash
  result = {
    :name => @name,
    :value => @value,
    :domain => @domain,
    :path => @path,
    :created_at => @created_at
  }
  {
    :expiry => @expiry,
    :secure => (true if @secure),
    :http_only => (true if @http_only),
    :version => (@version if version != 0),
    :comment => @comment,
    :comment_url => @comment_url,
    :discard => (true if @discard),
    :ports => @ports
  }.each do |name, value|
    result[name] = value if value
  end

  result
end

#to_json(*a) ⇒ String

Return a JSON 'object' for the various data values. Allows for persistence of the cookie information



207
208
209
# File 'lib/cookiejar/cookie.rb', line 207

def to_json *a
  to_hash.merge(:json_class => self.class.name).to_json(*a)
end

#to_s(ver = 0, prefix = true) ⇒ Object

Returns cookie in a format appropriate to send to a server.

“$Version=<version>;”. Ignored for Netscape-style cookies



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/cookiejar/cookie.rb', line 128

def to_s ver=0, prefix=true
  case ver
  when 0
    "#{name}=#{value}"
  when 1
    # we do not need to encode path; the only characters required to be
    # quoted must be escaped in URI
    str = prefix ? "$Version=#{version};" : ""
    str << "#{name}=#{value};$Path=\"#{path}\""
    if domain.start_with? '.'
      str << ";$Domain=#{domain}"
    end
    if ports
      str << ";$Port=\"#{ports.join ','}\""
    end
    str
  end
end