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



228
229
230
# File 'lib/cookiejar/cookie.rb', line 228

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
# 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:



109
110
111
112
113
114
115
116
# File 'lib/cookiejar/cookie.rb', line 109

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.



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/cookiejar/cookie.rb', line 205

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



166
167
168
# File 'lib/cookiejar/cookie.rb', line 166

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



153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/cookiejar/cookie.rb', line 153

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_json(*a) ⇒ String

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



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/cookiejar/cookie.rb', line 176

def to_json *a
  result = {
    :json_class => self.class.name,
    :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.to_json(*a)
end

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

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

"$Version=;". Ignored for Netscape-style cookies



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/cookiejar/cookie.rb', line 124

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