aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch/middleware/session
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2012-05-02 15:06:21 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2012-05-02 15:06:21 -0700
commit385afd47dab645f97b79c25419ec5e1f5b52babe (patch)
tree7d7b336084af2079bd8f7220b7729124e65ac32e /actionpack/lib/action_dispatch/middleware/session
parentc2807fb031cb96f92a3ef62cabd1fc7a7cd8c13d (diff)
downloadrails-385afd47dab645f97b79c25419ec5e1f5b52babe.tar.gz
rails-385afd47dab645f97b79c25419ec5e1f5b52babe.tar.bz2
rails-385afd47dab645f97b79c25419ec5e1f5b52babe.zip
session hash imported
Diffstat (limited to 'actionpack/lib/action_dispatch/middleware/session')
-rw-r--r--actionpack/lib/action_dispatch/middleware/session/abstract_store.rb126
1 files changed, 111 insertions, 15 deletions
diff --git a/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb b/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb
index b1e77eff3c..e9f5a9aebe 100644
--- a/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb
+++ b/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb
@@ -73,26 +73,17 @@ module ActionDispatch
private
- module DestroyableSession
- def destroy
- clear
- options = @env[Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY] if @env
- options ||= {}
- @by.send(:destroy_session, @env, options[:id], options) if @by
- options[:id] = nil
- @loaded = false
- end
- end
-
- ::Rack::Session::Abstract::SessionHash.send :include, DestroyableSession
-
def prepare_session(env)
session_was = env[ENV_SESSION_KEY]
- env[ENV_SESSION_KEY] = Rack::Session::Abstract::SessionHash.new(self, env)
+ env[ENV_SESSION_KEY] = Request::Session.new(self, env)
env[ENV_SESSION_OPTIONS_KEY] = Request::Session::Options.new(self, env, @default_options)
env[ENV_SESSION_KEY].merge! session_was if session_was
end
+ def loaded_session?(session)
+ !session.is_a?(Request::Session) || session.loaded?
+ end
+
def set_cookie(env, session_id, cookie)
request = ActionDispatch::Request.new(env)
request.cookie_jar[key] = cookie
@@ -102,7 +93,10 @@ module ActionDispatch
class Request
# SessionHash is responsible to lazily load the session from store.
- class Session
+ class Session < Hash
+ ENV_SESSION_KEY = Rack::Session::Abstract::ENV_SESSION_KEY # :nodoc:
+ ENV_SESSION_OPTIONS_KEY = Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY # :nodoc:
+
class Options #:nodoc:
def initialize(by, env, default_options)
@by = by
@@ -124,6 +118,108 @@ module ActionDispatch
def to_hash; @delegate.dup; end
def values_at(*args); @delegate.values_at(*args); end
end
+
+ def destroy
+ clear
+ options = @env[Rack::Session::Abstract::ENV_SESSION_OPTIONS_KEY] if @env
+ options ||= {}
+ @by.send(:destroy_session, @env, options[:id], options) if @by
+ options[:id] = nil
+ @loaded = false
+ end
+
+ def initialize(by, env)
+ super()
+ @by = by
+ @env = env
+ @loaded = false
+ end
+
+ def [](key)
+ load_for_read!
+ super(key.to_s)
+ end
+
+ def has_key?(key)
+ load_for_read!
+ super(key.to_s)
+ end
+ alias :key? :has_key?
+ alias :include? :has_key?
+
+ def []=(key, value)
+ load_for_write!
+ super(key.to_s, value)
+ end
+
+ def clear
+ load_for_write!
+ super
+ end
+
+ def to_hash
+ load_for_read!
+ h = {}.replace(self)
+ h.delete_if { |k,v| v.nil? }
+ h
+ end
+
+ def update(hash)
+ load_for_write!
+ super(stringify_keys(hash))
+ end
+
+ def delete(key)
+ load_for_write!
+ super(key.to_s)
+ end
+
+ def inspect
+ if loaded?
+ super
+ else
+ "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>"
+ end
+ end
+
+ def exists?
+ return @exists if instance_variable_defined?(:@exists)
+ @exists = @by.send(:session_exists?, @env)
+ end
+
+ def loaded?
+ @loaded
+ end
+
+ def empty?
+ load_for_read!
+ super
+ end
+
+ private
+
+ def load_for_read!
+ load! if !loaded? && exists?
+ end
+
+ def load_for_write!
+ load! unless loaded?
+ end
+
+ def load!
+ id, session = @by.send(:load_session, @env)
+ @env[ENV_SESSION_OPTIONS_KEY][:id] = id
+ replace(stringify_keys(session))
+ @loaded = true
+ end
+
+ def stringify_keys(other)
+ hash = {}
+ other.each do |key, value|
+ hash[key.to_s] = value
+ end
+ hash
+ end
end
end
end