Class: Merb::SessionStoreContainer

Inherits:
SessionContainer show all
Defined in:
lib/merb-core/dispatch/session/store_container.rb

Direct Known Subclasses

MemcacheSession, MemorySession

Instance Attribute Summary collapse

Attributes inherited from SessionContainer

#needs_new_cookie, #session_id

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from SessionContainer

#clear!, inherited, #initialize

Constructor Details

This class inherits a constructor from Merb::SessionContainer

Instance Attribute Details

#_fingerprintObject

Returns the value of attribute _fingerprint.



6
7
8
# File 'lib/merb-core/dispatch/session/store_container.rb', line 6

def _fingerprint
  @_fingerprint
end

Class Method Details

.generateObject

Generates a new session ID and creates a new session.

Returns

SessionStoreContainer

The new session.



53
54
55
56
57
# File 'lib/merb-core/dispatch/session/store_container.rb', line 53

def generate
  session = new(Merb::SessionMixin.rand_uuid)
  session.needs_new_cookie = true
  session
end

.setup(request) ⇒ Object

Setup a new session.

Parameters

request<Merb::Request>

The Merb::Request that came in from Rack.

Returns

SessionContainer

a SessionContainer. If no sessions were found,

a new SessionContainer will be generated.



67
68
69
70
71
72
73
# File 'lib/merb-core/dispatch/session/store_container.rb', line 67

def setup(request)
  session = retrieve(request.session_id)
  request.session = session
  # TODO Marshal.dump is slow - needs optimization
  session._fingerprint = Marshal.dump(request.session.to_hash).hash
  session
end

Instance Method Details

#finalize(request) ⇒ Object

Teardown and/or persist the current session.

If @_destroy is true, clear out the session completely, including removal of the session cookie itself.

Parameters

request<Merb::Request>

The Merb::Request that came in from Rack.

Notes

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.



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/merb-core/dispatch/session/store_container.rb', line 124

def finalize(request)
  if @_destroy
    store.delete_session(self.session_id)
    request.destroy_session_cookie
  else
    if _fingerprint != Marshal.dump(data = self.to_hash).hash
      begin
        store.store_session(request.session(self.class.session_store_type).session_id, data)
      rescue => err
        Merb.logger.warn!("Could not persist session to #{self.class.name}: #{err.message}")
      end
    end
    if needs_new_cookie || Merb::SessionMixin.needs_new_cookie?
      request.set_session_id_cookie(self.session_id)
    end
  end
end

#regenerateObject

Regenerate the session ID.



143
144
145
146
147
# File 'lib/merb-core/dispatch/session/store_container.rb', line 143

def regenerate
  store.delete_session(self.session_id)
  self.session_id = Merb::SessionMixin.rand_uuid
  store.store_session(self.session_id, self)
end