Parent

Class/Module Index [+]

Quicksearch

Merb::SessionStoreContainer

Constants

GENERATE_MAX_TRIES

Determines how many times to try generating a unique session key before we give up

Attributes

_fingerprint[RW]

:api: private

Public Class Methods

generate() click to toggle source

Generates a new session ID and creates a new session.

Returns

SessionStoreContainer

The new session.

:api: private

# File lib/merb-core/dispatch/session/store_container.rb, line 59
def generate
  
  # make sure we generate a unique session uuid
  sid = nil
  GENERATE_MAX_TRIES.times do |i|
    sid = Merb::SessionMixin.rand_uuid
    data = store.retrieve_session(sid) rescue nil
    break if data.nil?
    raise "Unable to Generate Unique Session key" if i == (GENERATE_MAX_TRIES-1)
  end
  
  session = new(sid)
  session.needs_new_cookie = true
  session
end
setup(request) click to toggle source

Setup a new session or retreive an existing session.

Parameters

request<Merb::Request>

The Merb::Request that came in from Rack.

Notes

If no sessions were found, a new SessionContainer will be generated.

Returns

SessionContainer

a SessionContainer.

:api: private

# File lib/merb-core/dispatch/session/store_container.rb, line 87
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

Public Instance Methods

finalize(request) click to toggle source

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.

:api: private

# File lib/merb-core/dispatch/session/store_container.rb, line 148
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
regenerate() click to toggle source

Regenerate the session ID.

:api: private

# File lib/merb-core/dispatch/session/store_container.rb, line 169
def regenerate
  store.delete_session(self.session_id)
  self.session_id = Merb::SessionMixin.rand_uuid
  store.store_session(self.session_id, self)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.