Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Rack::Session::Abstract::Persisted https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb
- def call(env)
- context(env)
- end
- def context(env, app = @app)
- req = make_request env
- prepare_session(req)
- status, headers, body = app.call(req.env)
- res = Rack::Response::Raw.new status, headers
- commit_session(req, res)
- [status, headers, body]
- end
- ....
- def commit_session?(req, session, options)
- if options[:skip]
- false
- else
- has_session = loaded_session?(session) || forced_session_update?(session, options)
- has_session && security_matches?(req, options)
- end
- end
- ....
- def commit_session(req, res)
- session = req.get_header RACK_SESSION
- options = session.options
- if options[:drop] || options[:renew]
- session_id = delete_session(req, session.id || generate_sid, options)
- return unless session_id
- end
- return unless commit_session?(req, session, options)
- session.send(:load!) unless loaded_session?(session)
- session_id ||= session.id
- session_data = session.to_hash.delete_if { |k, v| v.nil? }
- if not data = write_session(req, session_id, session_data, options)
- req.get_header(RACK_ERRORS).puts("Warning! #{self.class.name} failed to save session. Content dropped.")
- elsif options[:defer] and not options[:renew]
- req.get_header(RACK_ERRORS).puts("Deferring cookie for #{session_id}") if $VERBOSE
- else
- cookie = Hash.new
- cookie[:value] = data
- cookie[:expires] = Time.now + options[:expire_after] if options[:expire_after]
- cookie[:expires] = Time.now + options[:max_age] if options[:max_age]
- set_cookie(req, res, cookie.merge!(options))
- end
- end
- ActiveRecordStore implementation (https://github.com/rails/activerecord-session_store/blob/master/lib/action_dispatch/session/active_record_store.rb)
- def write_session(request, sid, session_data, options)
- logger.silence_logger do
- record = get_session_model(request, sid)
- record.data = session_data
- return false unless record.save
- session_data = record.data
- if session_data && session_data.respond_to?(:each_value)
- session_data.each_value do |obj|
- obj.clear_association_cache if obj.respond_to?(:clear_association_cache)
- end
- end
- sid
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement