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

Parameters:

  • request_uri (String, URI)

    address being requested

Returns:

  • (Array<String>)

    String domain matches



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.

Parameters:

  • request_uri (String, URI)

    HTTP/HTTPS absolute URI of request.

  • set_cookie_value (String)

    HTTP value for the Set-Cookie header.

Returns:

  • (Cookie)

    created from the header string and request URI

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.

Parameters:

  • request_uri (String, URI)

    HTTP/HTTPS absolute URI of request.

  • set_cookie_value (String)

    HTTP value for the Set-Cookie2 header.

Returns:

  • (Cookie)

    created from the header string and request URI

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.

Parameters:

  • o (Hash)

    JSON object of array data

Returns:

  • (Cookie)

    cookie formed from JSON 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

Parameters:

  • time (Time) (defaults to: Time.now)

    to compare against, or ‘now’ if omitted

Returns:

  • (Boolean)


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

Returns:

  • (Time, nil)

    Time of expiry, if this cookie has an expiry set



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

Returns:

  • (Boolean)


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

Parameters:

  • uri (String, URI)

    the requested page which may need to receive

  • script (Boolean)

    indicates that cookies with the ‘httponly’

Returns:

  • (Boolean)

    whether this cookie should be sent to the server



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

Parameters:

  • a (Array)

    options controlling output JSON text (usually a State and a depth)

Returns:

  • (String)

    JSON representation of object data



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=<version>;”. Ignored for Netscape-style cookies

Parameters:

  • 0 (FixNum)

    version, 0 for Netscape-style cookies, 1 for RFC2965-style.

  • true (Boolean)

    prefix, for RFC2965, whether to prefix with



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