Skip to content

Commit

Permalink
Add native Rack session handler, fixes GH-143
Browse files Browse the repository at this point in the history
  • Loading branch information
mperham committed Nov 22, 2011
1 parent 3701477 commit 4ac5a99
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
10 changes: 10 additions & 0 deletions History.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
Dalli Changelog
=====================

HEAD
=======

- Added support for native Rack session store. Until now, Dalli's
session store has required Rails. Now you can use Dalli to store
sessions for any Rack application.

require 'rack/session/dalli'
use Rack::Session::Dalli, :memcache_server => 'localhost:11211', :compression => true

1.1.3
=======

Expand Down
52 changes: 52 additions & 0 deletions lib/rack/session/dalli.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
require 'rack/session/abstract/id'
require 'dalli'

module Rack
module Session
class Dalli < Abstract::ID
attr_reader :pool

DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge \
:namespace => 'rack:session',
:memcache_server => 'localhost:11211'

def initialize(app, options={})
super
mserv = @default_options[:memcache_server]
mopts = @default_options.reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k }
@pool = options[:cache] || Dalli::Client.new(mserv, mopts)
end

def generate_sid
loop do
sid = super
break sid unless @pool.get(sid)
end
end

def get_session(env, sid)
unless sid and session = @pool.get(sid)
sid, session = generate_sid, {}
unless @pool.add(sid, session)
raise "Session collision on '#{sid.inspect}'"
end
end
[sid, session]
end

def set_session(env, session_id, new_session, options)
expiry = options[:expire_after]
expiry = expiry.nil? ? 0 : expiry + 1

@pool.set session_id, new_session, expiry
session_id
end

def destroy_session(env, session_id, options)
@pool.delete(session_id)
generate_sid unless options[:drop]
end

end
end
end

0 comments on commit 4ac5a99

Please sign in to comment.