Class: Rage::Cookies

Inherits:
Object
  • Object
show all
Defined in:
lib/rage/cookies.rb

Defined Under Namespace

Classes: EncryptedJar, SimpleJar

Instance Method Summary collapse

Instance Method Details

#[](key) ⇒ String

Read a cookie.

Parameters:

  • key (Symbol)

Returns:

  • (String)


30
31
32
33
# File 'lib/rage/cookies.rb', line 30

def [](key)
  value = request_cookies[key]
  @jar.load(value) if value
end

#[]=(key, value) ⇒ Object

Set a cookie.

Examples:

cookie[:user_id] = current_user.id
cookie[:user_id] = { value: current_user.id, httponly: true, secure: true }

Parameters:

  • key (Symbol)
  • value (String, Hash)

Options Hash (value):

  • :path (String)
  • :secure (Boolean)
  • :httponly (Boolean)
  • :same_site (nil, :none, :lax, :strict)
  • :expires (Time)
  • :domain (String, Array<String>, :all)
  • :value (String)


90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'lib/rage/cookies.rb', line 90

def []=(key, value)
  @headers.compare_by_identity

  unless value.is_a?(Hash)
    serialized_value = @jar.dump(value)
    @request_cookies[key] = serialized_value
    @headers[set_cookie_key(key)] = Rack::Utils.add_cookie_to_header(nil, key, { value: serialized_value, expires: @expires })
    return
  end

  if (domain = value[:domain])
    host = @env["HTTP_HOST"]

    _domain = if domain.is_a?(String)
      domain
    elsif domain == :all
      DomainName(host).domain
    elsif domain.is_a?(Array)
      host if domain.include?(host)
    end
  end

  serialized_value = @jar.dump(value[:value])
  cookie = Rack::Utils.add_cookie_to_header(nil, key, {
    path: value[:path],
    secure: value[:secure],
    expires: value[:expires] || @expires,
    httponly: value[:httponly],
    same_site: value[:same_site],
    value: serialized_value,
    domain: _domain
  })

  @request_cookies[key] = serialized_value
  @headers[set_cookie_key(key)] = cookie
end

#delete(key, path: "/", domain: nil) ⇒ Object

Delete a cookie.

Parameters:

  • key (Symbol)
  • path (String) (defaults to: "/")
  • domain (String) (defaults to: nil)


47
48
49
50
51
52
53
54
# File 'lib/rage/cookies.rb', line 47

def delete(key, path: "/", domain: nil)
  @headers.compare_by_identity

  @request_cookies[key] = nil
  @headers[set_cookie_key(key)] = Rack::Utils.add_cookie_to_header(nil, key, {
    value: "", expires: Time.at(0), path: path, domain: domain
  })
end

#encryptedObject

Returns a jar that'll automatically encrypt cookie values before sending them to the client and will decrypt them for read. If the cookie was tampered with by the user (or a 3rd party), nil will be returned.

This jar requires that you set a suitable secret for the verification on your app's secret_key_base.

Examples:

cookies.encrypted[:user_id] = current_user.id


63
64
65
# File 'lib/rage/cookies.rb', line 63

def encrypted
  dup.tap { |c| c.jar = EncryptedJar }
end

#inspectObject



127
128
129
130
131
132
133
134
135
136
# File 'lib/rage/cookies.rb', line 127

def inspect
  cookies = request_cookies.transform_values do |v|
    decoded = Base64.urlsafe_decode64(v) rescue nil
    is_encrypted = decoded&.start_with?(EncryptedJar::PADDING)

    is_encrypted ? "<encrypted>" : v
  end

  "#<#{self.class.name} @request_cookies=#{cookies.inspect}"
end

#permanentObject

Returns a jar that'll automatically set the assigned cookies to have an expiration date 20 years from now.

Examples:

cookies.permanent[:user_id] = current_user.id


71
72
73
# File 'lib/rage/cookies.rb', line 71

def permanent
  dup.tap { |c| c.expires = Time.now + 20 * 365 * 24 * 60 * 60 }
end

#sizeInteger

Get the number of cookies.

Returns:

  • (Integer)


38
39
40
# File 'lib/rage/cookies.rb', line 38

def size
  request_cookies.count { |_, v| !v.nil? }
end