Skip to content

Commit

Permalink
Only save the session if we're actually writing to it [#2703 state:re…
Browse files Browse the repository at this point in the history
…solved]

Signed-off-by: Joshua Peek <josh@joshpeek.com>
  • Loading branch information
js authored and josh committed May 28, 2009
1 parent dc94c09 commit 14edaa1
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
11 changes: 10 additions & 1 deletion actionpack/lib/action_controller/session/abstract_store.rb
Expand Up @@ -15,6 +15,7 @@ def initialize(by, env)
@by = by
@env = env
@loaded = false
@updated = false
end

def session_id
Expand All @@ -32,6 +33,7 @@ def [](key)
def []=(key, value)
load! unless @loaded
super
@updated = true
end

def to_hash
Expand All @@ -57,6 +59,10 @@ def loaded?
@loaded
end

def updated?
@updated
end

def load!
stale_session_check! do
id, session = @by.send(:load_session, @env)
Expand Down Expand Up @@ -125,7 +131,10 @@ def call(env)
options = env[ENV_SESSION_OPTIONS_KEY]

if !session_data.is_a?(AbstractStore::SessionHash) || session_data.send(:loaded?) || options[:expire_after]
session_data.send(:load!) if session_data.is_a?(AbstractStore::SessionHash) && !session_data.send(:loaded?)
if session_data.is_a?(AbstractStore::SessionHash)
session_data.send(:load!) if !session_data.send(:loaded?)
return response if !session_data.send(:updated?)
end

sid = options[:id] || generate_sid

Expand Down
22 changes: 22 additions & 0 deletions actionpack/test/activerecord/active_record_store_test.rb
Expand Up @@ -21,6 +21,11 @@ def get_session_value
render :text => "foo: #{session[:foo].inspect}"
end

def set_cookie_and_get_session_value
cookies["kittens"] = { :value => "fluffy" }
render :text => "foo: #{session[:foo].inspect}"
end

def get_session_id
session[:foo]
render :text => "#{request.session_options[:id]}"
Expand Down Expand Up @@ -73,6 +78,23 @@ def test_getting_nil_session_value
end
end

def test_getting_session_value_does_not_set_cookie
with_test_route_set do
get '/get_session_value'
assert_response :success
assert_equal "", headers["Set-Cookie"]
end
end

def test_getting_session_value_and_setting_a_cookie_doesnt_delete_all_cookies
with_test_route_set do
get '/set_cookie_and_get_session_value'
assert_response :success
assert_equal 'foo: nil', response.body
assert_equal({"kittens" => "fluffy"}, response.cookies)
end
end

def test_setting_session_value_after_session_reset
with_test_route_set do
get '/set_session_value'
Expand Down
8 changes: 8 additions & 0 deletions actionpack/test/controller/session/mem_cache_store_test.rb
Expand Up @@ -61,6 +61,14 @@ def test_getting_nil_session_value
end
end

def test_getting_session_value_does_not_set_cookie
with_test_route_set do
get '/get_session_value'
assert_response :success
assert_equal "", headers["Set-Cookie"]
end
end

def test_setting_session_value_after_session_reset
with_test_route_set do
get '/set_session_value'
Expand Down

0 comments on commit 14edaa1

Please sign in to comment.