diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2012-05-02 15:06:21 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2012-05-02 15:06:21 -0700 |
commit | 385afd47dab645f97b79c25419ec5e1f5b52babe (patch) | |
tree | 7d7b336084af2079bd8f7220b7729124e65ac32e /actionpack | |
parent | c2807fb031cb96f92a3ef62cabd1fc7a7cd8c13d (diff) | |
download | rails-385afd47dab645f97b79c25419ec5e1f5b52babe.tar.gz rails-385afd47dab645f97b79c25419ec5e1f5b52babe.tar.bz2 rails-385afd47dab645f97b79c25419ec5e1f5b52babe.zip |
session hash imported
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/lib/action_dispatch/middleware/session/abstract_store.rb | 126 |
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 |