| Class | Merb::SessionStoreContainer |
| In: |
merb-core/lib/merb-core/dispatch/session/store_container.rb
|
| Parent: | SessionContainer |
| _fingerprint | [RW] | :api: private |
Generates a new session ID and creates a new session.
| SessionStoreContainer: | The new session. |
:api: private
# File merb-core/lib/merb-core/dispatch/session/store_container.rb, line 56
56: def generate
57: session = new(Merb::SessionMixin.rand_uuid)
58: session.needs_new_cookie = true
59: session
60: end
Setup a new session or retreive an existing session.
| request<Merb::Request>: | The Merb::Request that came in from Rack. |
If no sessions were found, a new SessionContainer will be generated.
| SessionContainer: | a SessionContainer. |
:api: private
# File merb-core/lib/merb-core/dispatch/session/store_container.rb, line 74
74: def setup(request)
75: session = retrieve(request.session_id)
76: request.session = session
77: # TODO Marshal.dump is slow - needs optimization
78: session._fingerprint = Marshal.dump(request.session.to_hash).hash
79: session
80: end
| session_id<String: | The ID of the session to retrieve. |
| SessionStoreContainer: | SessionStoreContainer instance with the session data. If no |
sessions matched session_id, a new SessionStoreContainer will be generated.
If there are persisted exceptions callbacks to execute, they all get executed when Memcache library raises an exception.
:api: private
# File merb-core/lib/merb-core/dispatch/session/store_container.rb, line 96
96: def retrieve(session_id)
97: unless session_id.blank?
98: begin
99: session_data = store.retrieve_session(session_id)
100: rescue => err
101: Merb.logger.warn!("Could not retrieve session from #{self.name}: #{err.message}")
102: end
103: # Not in container, but assume that cookie exists
104: session_data = new(session_id) if session_data.nil?
105: else
106: # No cookie...make a new session_id
107: session_data = generate
108: end
109: if session_data.is_a?(self)
110: session_data
111: else
112: # Recreate using the existing session as the data, when switching
113: # from another session type for example, eg. cookie to memcached
114: # or when the data is just a hash
115: new(session_id).update(session_data)
116: end
117: end
Teardown and/or persist the current session.
If @_destroy is true, clear out the session completely, including removal of the session cookie itself.
| request<Merb::Request>: | The Merb::Request that came in from Rack. |
The data (self) is converted to a Hash first, since a container might choose to do a full Marshal on the data, which would make it persist attributes like ‘needs_new_cookie’, which it shouldn‘t.
:api: private
# File merb-core/lib/merb-core/dispatch/session/store_container.rb, line 135
135: def finalize(request)
136: if @_destroy
137: store.delete_session(self.session_id)
138: request.destroy_session_cookie
139: else
140: if _fingerprint != Marshal.dump(data = self.to_hash).hash
141: begin
142: store.store_session(request.session(self.class.session_store_type).session_id, data)
143: rescue => err
144: Merb.logger.warn!("Could not persist session to #{self.class.name}: #{err.message}")
145: end
146: end
147: if needs_new_cookie || Merb::SessionMixin.needs_new_cookie?
148: request.set_session_id_cookie(self.session_id)
149: end
150: end
151: end