Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make low level session methods public #83

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 32 additions & 32 deletions lib/redis-session-store.rb
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,38 @@ def initialize(app, options = {})

attr_accessor :on_redis_down, :on_session_load_error

def get_session(env, sid)
unless sid && (session = load_session_from_redis(sid))
sid = generate_sid
session = {}
end

[sid, session]
rescue Errno::ECONNREFUSED, Redis::CannotConnectError => e
on_redis_down.call(e, env, sid) if on_redis_down
[generate_sid, {}]
end
alias find_session get_session

def set_session(env, sid, session_data, options = nil)
expiry = (options || env.fetch(ENV_SESSION_OPTIONS_KEY))[:expire_after]
if expiry
redis.setex(prefixed(sid), expiry, encode(session_data))
else
redis.set(prefixed(sid), encode(session_data))
end
return sid
rescue Errno::ECONNREFUSED, Redis::CannotConnectError => e
on_redis_down.call(e, env, sid) if on_redis_down
return false
end
alias write_session set_session

def destroy_session(env, sid, options)
destroy_session_from_sid(sid, (options || {}).to_hash.merge(env: env))
end
alias delete_session destroy_session

private

attr_reader :redis, :key, :default_options, :serializer
Expand Down Expand Up @@ -86,19 +118,6 @@ def prefixed(sid)
"#{default_options[:key_prefix]}#{sid}"
end

def get_session(env, sid)
unless sid && (session = load_session_from_redis(sid))
sid = generate_sid
session = {}
end

[sid, session]
rescue Errno::ECONNREFUSED, Redis::CannotConnectError => e
on_redis_down.call(e, env, sid) if on_redis_down
[generate_sid, {}]
end
alias find_session get_session

def load_session_from_redis(sid)
data = redis.get(prefixed(sid))
begin
Expand All @@ -114,29 +133,10 @@ def decode(data)
serializer.load(data)
end

def set_session(env, sid, session_data, options = nil)
expiry = (options || env.fetch(ENV_SESSION_OPTIONS_KEY))[:expire_after]
if expiry
redis.setex(prefixed(sid), expiry, encode(session_data))
else
redis.set(prefixed(sid), encode(session_data))
end
return sid
rescue Errno::ECONNREFUSED, Redis::CannotConnectError => e
on_redis_down.call(e, env, sid) if on_redis_down
return false
end
alias write_session set_session

def encode(session_data)
serializer.dump(session_data)
end

def destroy_session(env, sid, options)
destroy_session_from_sid(sid, (options || {}).to_hash.merge(env: env))
end
alias delete_session destroy_session

def destroy(env)
if env['rack.request.cookie_hash'] &&
(sid = env['rack.request.cookie_hash'][key])
Expand Down
38 changes: 19 additions & 19 deletions spec/redis_session_store_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@

context 'when successfully persisting the session' do
it 'returns the session id' do
expect(store.send(:set_session, env, session_id, session_data, options))
expect(store.set_session(env, session_id, session_data, options))
.to eq(session_id)
end
end
Expand All @@ -152,7 +152,7 @@
end

it 'returns false' do
expect(store.send(:set_session, env, session_id, session_data, options))
expect(store.set_session(env, session_id, session_data, options))
.to eq(false)
end
end
Expand All @@ -161,7 +161,7 @@
let(:options) { {} }

it 'sets the session value without expiry' do
expect(store.send(:set_session, env, session_id, session_data, options))
expect(store.set_session(env, session_id, session_data, options))
.to eq(session_id)
end
end
Expand All @@ -173,12 +173,12 @@
end

it 'returns false' do
expect(store.send(:set_session, env, session_id, session_data, options))
expect(store.set_session(env, session_id, session_data, options))
.to eq(false)
end

it 'calls the on_redis_down handler' do
store.send(:set_session, env, session_id, session_data, options)
store.set_session(env, session_id, session_data, options)
expect(@redis_down_handled).to eq(true)
end

Expand All @@ -187,7 +187,7 @@

it 'explodes' do
expect do
store.send(:set_session, env, session_id, session_data, options)
store.set_session(env, session_id, session_data, options)
end.to raise_error(Redis::CannotConnectError)
end
end
Expand Down Expand Up @@ -264,7 +264,7 @@
allow(store).to receive(:generate_sid).and_return(fake_key)
expect(redis).to receive(:get).with("#{options[:key_prefix]}#{fake_key}")

store.send(:get_session, double('env'), fake_key)
store.get_session(double('env'), fake_key)
end

context 'when redis is down' do
Expand All @@ -274,12 +274,12 @@
end

it 'returns an empty session hash' do
expect(store.send(:get_session, double('env'), fake_key).last)
expect(store.get_session(double('env'), fake_key).last)
.to eq({})
end

it 'returns a newly generated sid' do
expect(store.send(:get_session, double('env'), fake_key).first)
expect(store.get_session(double('env'), fake_key).first)
.to eq('foop')
end

Expand All @@ -288,7 +288,7 @@

it 'explodes' do
expect do
store.send(:get_session, double('env'), fake_key)
store.get_session(double('env'), fake_key)
end.to raise_error(Redis::CannotConnectError)
end
end
Expand Down Expand Up @@ -342,7 +342,7 @@
sid = store.send(:generate_sid)
expect(redis).to receive(:del).with("#{options[:key_prefix]}#{sid}")

store.send(:destroy_session, {}, sid, nil)
store.destroy_session({}, sid, nil)
end
end
end
Expand All @@ -363,11 +363,11 @@
shared_examples_for 'serializer' do
it 'encodes correctly' do
expect(redis).to receive(:set).with('12345', expected_encoding)
store.send(:set_session, env, session_id, session_data, options)
store.set_session(env, session_id, session_data, options)
end

it 'decodes correctly' do
expect(store.send(:get_session, env, session_id))
expect(store.get_session(env, session_id))
.to eq([session_id, session_data])
end
end
Expand Down Expand Up @@ -519,10 +519,10 @@ def self.dump(_value)
sid = 1234
allow(store).to receive(:redis).and_return(Redis.new)
data1 = { 'foo' => 'bar' }
store.send(:set_session, env, sid, data1)
store.set_session(env, sid, data1)
data2 = { 'baz' => 'wat' }
store.send(:set_session, env, sid, data2)
_, session = store.send(:get_session, env, sid)
store.set_session(env, sid, data2)
_, session = store.get_session(env, sid)
expect(session).to eq(data2)
end

Expand All @@ -531,10 +531,10 @@ def self.dump(_value)
sid = 1234
allow(store).to receive(:redis).and_return(Redis.new)
data1 = { 'foo' => 'bar' }
store.send(:set_session, env, sid, data1)
store.set_session(env, sid, data1)
data2 = { 'baz' => 'wat' }
store.send(:set_session, env, sid, data2)
_, session = store.send(:get_session, env, sid)
store.set_session(env, sid, data2)
_, session = store.get_session(env, sid)
expect(session).to eq(data2)
end
end
Expand Down