1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Only save the session if we're actually writing to it [#2703 state:resolved]

Signed-off-by: Joshua Peek <josh@joshpeek.com>
This commit is contained in:
Johan Sörensen 2009-05-28 09:35:17 -05:00 committed by Joshua Peek
parent 72cb6f58be
commit dd98280e38
3 changed files with 40 additions and 1 deletions

View file

@ -15,6 +15,7 @@ module ActionDispatch
@by = by
@env = env
@loaded = false
@updated = false
end
def session_id
@ -32,6 +33,7 @@ module ActionDispatch
def []=(key, value)
load! unless @loaded
super(key.to_s, value)
@updated = true
end
def to_hash
@ -79,6 +81,10 @@ module ActionDispatch
@loaded
end
def updated?
@updated
end
def load!
stale_session_check! do
id, session = @by.send(:load_session, @env)
@ -147,7 +153,10 @@ module ActionDispatch
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

View file

@ -22,6 +22,11 @@ class ActiveRecordStoreTest < ActionController::IntegrationTest
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]}"
@ -78,6 +83,23 @@ class ActiveRecordStoreTest < ActionController::IntegrationTest
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'

View file

@ -61,6 +61,14 @@ class MemCacheStoreTest < ActionController::IntegrationTest
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'