class Rack::Session::Redis

Constants

DEFAULT_OPTIONS

Attributes

mutex[R]

Public Class Methods

new(app, options = {}) click to toggle source
Calls superclass method
# File lib/rack/session/redis.rb, line 15
def initialize(app, options = {})
  super

  @mutex = Mutex.new
  @conn = ::Redis::Rack::Connection.new(@default_options)
end

Public Instance Methods

delete_session(req, sid, options) click to toggle source
# File lib/rack/session/redis.rb, line 54
def delete_session(req, sid, options)
  with_lock(req) do
    with do |c|
      c.del(sid.public_id)
      c.del(sid.private_id)
    end
    generate_sid unless options[:drop]
  end
end
find_session(req, sid) click to toggle source
# File lib/rack/session/redis.rb, line 33
def find_session(req, sid)
  if req.session.options[:skip]
    [generate_sid, {}]
  else
    with_lock(req, [nil, {}]) do
      unless sid and session = get_session_with_fallback(sid)
        session = {}
        sid = generate_unique_sid(session)
      end
      [sid, session]
    end
  end
end
generate_unique_sid(session) click to toggle source
# File lib/rack/session/redis.rb, line 22
def generate_unique_sid(session)
  return generate_sid if session.empty?
  loop do
    sid = generate_sid
    first = with do |c|
      [*c.setnx(sid.private_id, session, @default_options.to_hash)].first
    end
    break sid if [1, true].include?(first)
  end
end
threadsafe?() click to toggle source
# File lib/rack/session/redis.rb, line 64
def threadsafe?
  @default_options.fetch(:threadsafe, true)
end
with(&block) click to toggle source
# File lib/rack/session/redis.rb, line 81
def with(&block)
  @conn.with(&block)
end
with_lock(req, default = nil) { || ... } click to toggle source
# File lib/rack/session/redis.rb, line 68
def with_lock(req, default = nil)
  @mutex.lock if req.multithread? && threadsafe?
  yield
rescue Errno::ECONNREFUSED
  if $VERBOSE
    warn "#{self} is unable to find Redis server."
    warn $!.inspect
  end
  default
ensure
  @mutex.unlock if @mutex.locked?
end
write_session(req, sid, new_session, options = {}) click to toggle source
# File lib/rack/session/redis.rb, line 47
def write_session(req, sid, new_session, options = {})
  with_lock(req, false) do
    with { |c| c.set(sid.private_id, new_session, options.to_hash) }
    sid
  end
end

Private Instance Methods

get_session_with_fallback(sid) click to toggle source
# File lib/rack/session/redis.rb, line 87
def get_session_with_fallback(sid)
  with { |c| c.get(sid.private_id) || c.get(sid.public_id) }
end