Advertisement
Guest User

Untitled

a guest
Jun 26th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.26 KB | None | 0 0
  1. Rack::Session::Abstract::Persisted https://github.com/rack/rack/blob/master/lib/rack/session/abstract/id.rb
  2.  
  3. def call(env)
  4.   context(env)
  5. end
  6.  
  7. def context(env, app = @app)
  8.   req = make_request env
  9.   prepare_session(req)
  10.   status, headers, body = app.call(req.env)
  11.   res = Rack::Response::Raw.new status, headers
  12.   commit_session(req, res)
  13.   [status, headers, body]
  14. end
  15.  
  16. ....
  17.  
  18. def commit_session?(req, session, options)
  19.   if options[:skip]
  20.     false
  21.   else
  22.     has_session = loaded_session?(session) || forced_session_update?(session, options)
  23.     has_session && security_matches?(req, options)
  24.   end
  25. end
  26.  
  27. ....
  28.  
  29. def commit_session(req, res)
  30.   session = req.get_header RACK_SESSION
  31.   options = session.options
  32.  
  33.   if options[:drop] || options[:renew]
  34.     session_id = delete_session(req, session.id || generate_sid, options)
  35.     return unless session_id
  36.   end
  37.  
  38.   return unless commit_session?(req, session, options)
  39.  
  40.   session.send(:load!) unless loaded_session?(session)
  41.   session_id ||= session.id
  42.   session_data = session.to_hash.delete_if { |k, v| v.nil? }
  43.  
  44.   if not data = write_session(req, session_id, session_data, options)
  45.     req.get_header(RACK_ERRORS).puts("Warning! #{self.class.name} failed to save session. Content dropped.")
  46.   elsif options[:defer] and not options[:renew]
  47.     req.get_header(RACK_ERRORS).puts("Deferring cookie for #{session_id}") if $VERBOSE
  48.   else
  49.     cookie = Hash.new
  50.     cookie[:value] = data
  51.     cookie[:expires] = Time.now + options[:expire_after] if options[:expire_after]
  52.     cookie[:expires] = Time.now + options[:max_age] if options[:max_age]
  53.     set_cookie(req, res, cookie.merge!(options))
  54.   end
  55. end
  56.  
  57. ActiveRecordStore implementation (https://github.com/rails/activerecord-session_store/blob/master/lib/action_dispatch/session/active_record_store.rb)
  58.  
  59. def write_session(request, sid, session_data, options)
  60.   logger.silence_logger do
  61.     record = get_session_model(request, sid)
  62.     record.data = session_data
  63.     return false unless record.save
  64.  
  65.     session_data = record.data
  66.     if session_data && session_data.respond_to?(:each_value)
  67.       session_data.each_value do |obj|
  68.         obj.clear_association_cache if obj.respond_to?(:clear_association_cache)
  69.       end
  70.     end
  71.  
  72.     sid
  73.   end
  74. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement