Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1421 from fatkodima/memcache-client-to-dalli
Deprecate Rack::Session::Memcache in favor of Rack::Session::Dalli from dalli gem
- Loading branch information
Showing
4 changed files
with
6 additions
and
416 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,98 +1,10 @@ | ||
# frozen_string_literal: true | ||
|
||
# AUTHOR: blink <blinketje@gmail.com>; blink#ruby-lang@irc.freenode.net | ||
|
||
require 'rack/session/abstract/id' | ||
require 'memcache' | ||
require 'rack/core_ext/regexp' | ||
require 'rack/session/dalli' | ||
|
||
module Rack | ||
module Session | ||
# Rack::Session::Memcache provides simple cookie based session management. | ||
# Session data is stored in memcached. The corresponding session key is | ||
# maintained in the cookie. | ||
# You may treat Session::Memcache as you would Session::Pool with the | ||
# following caveats. | ||
# | ||
# * Setting :expire_after to 0 would note to the Memcache server to hang | ||
# onto the session data until it would drop it according to it's own | ||
# specifications. However, the cookie sent to the client would expire | ||
# immediately. | ||
# | ||
# Note that memcache does drop data before it may be listed to expire. For | ||
# a full description of behaviour, please see memcache's documentation. | ||
|
||
class Memcache < Abstract::ID | ||
using ::Rack::RegexpExtensions | ||
|
||
attr_reader :mutex, :pool | ||
|
||
DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge \ | ||
namespace: 'rack:session', | ||
memcache_server: 'localhost:11211' | ||
|
||
def initialize(app, options = {}) | ||
super | ||
|
||
@mutex = Mutex.new | ||
mserv = @default_options[:memcache_server] | ||
mopts = @default_options.reject{|k, v| !MemCache::DEFAULT_OPTIONS.include? k } | ||
|
||
@pool = options[:cache] || MemCache.new(mserv, mopts) | ||
unless @pool.active? and @pool.servers.any?(&:alive?) | ||
raise 'No memcache servers' | ||
end | ||
end | ||
|
||
def generate_sid | ||
loop do | ||
sid = super | ||
break sid unless @pool.get(sid, true) | ||
end | ||
end | ||
|
||
def get_session(env, sid) | ||
with_lock(env) do | ||
unless sid and session = @pool.get(sid) | ||
sid, session = generate_sid, {} | ||
unless /^STORED/.match?(@pool.add(sid, session)) | ||
raise "Session collision on '#{sid.inspect}'" | ||
end | ||
end | ||
[sid, session] | ||
end | ||
end | ||
|
||
def set_session(env, session_id, new_session, options) | ||
expiry = options[:expire_after] | ||
expiry = expiry.nil? ? 0 : expiry + 1 | ||
|
||
with_lock(env) do | ||
@pool.set session_id, new_session, expiry | ||
session_id | ||
end | ||
end | ||
|
||
def destroy_session(env, session_id, options) | ||
with_lock(env) do | ||
@pool.delete(session_id) | ||
generate_sid unless options[:drop] | ||
end | ||
end | ||
|
||
def with_lock(env) | ||
@mutex.lock if env[RACK_MULTITHREAD] | ||
yield | ||
rescue MemCache::MemCacheError, Errno::ECONNREFUSED | ||
if $VERBOSE | ||
warn "#{self} is unable to find memcached server." | ||
warn $!.inspect | ||
end | ||
raise | ||
ensure | ||
@mutex.unlock if @mutex.locked? | ||
end | ||
|
||
end | ||
warn "Rack::Session::Memcache is deprecated, please use Rack::Session::Dalli from 'dalli' gem instead." | ||
Memcache = Dalli | ||
end | ||
end |
Oops, something went wrong.