Separated code to have a lib and an example. Improved design, fixed a few issues related to folder location. This is still experimental and require more work to be really friendly to use.
135 lines
2.7 KiB
Plaintext
135 lines
2.7 KiB
Plaintext
note
|
|
description: "[
|
|
Summary description for CMS_SESSION_CONTROLER.
|
|
]"
|
|
date: "$Date$"
|
|
revision: "$Revision$"
|
|
|
|
class
|
|
CMS_SESSION_CONTROLER
|
|
|
|
inherit
|
|
ANY
|
|
|
|
WSF_SESSION_FACTORY [WSF_SESSION]
|
|
|
|
create
|
|
make
|
|
|
|
feature -- Initialization
|
|
|
|
make (req: WSF_REQUEST; a_mngr: like session_manager)
|
|
do
|
|
session_manager := a_mngr
|
|
initialize
|
|
create discarded_sessions.make
|
|
get_session (req)
|
|
end
|
|
|
|
initialize
|
|
do
|
|
end
|
|
|
|
feature -- Session access
|
|
|
|
session: WSF_SESSION
|
|
|
|
has_pending_session: BOOLEAN
|
|
|
|
discarded_sessions: LINKED_LIST [like session]
|
|
|
|
feature -- Session operation
|
|
|
|
session_commit (page: CMS_HTML_PAGE_RESPONSE; e: CMS_EXECUTION)
|
|
do
|
|
if has_pending_session then
|
|
session.apply_to (page.header, e.request, e.request.script_url ("/"))
|
|
end
|
|
session.commit
|
|
end
|
|
|
|
apply_sessions_to (h: HTTP_HEADER; req: WSF_REQUEST; a_path: detachable READABLE_STRING_8)
|
|
do
|
|
session.apply_to (h, req, a_path)
|
|
across
|
|
discarded_sessions as c
|
|
loop
|
|
c.item.apply_to (h, req, a_path)
|
|
end
|
|
end
|
|
|
|
start_session (req: WSF_REQUEST)
|
|
-- Start a new session
|
|
local
|
|
s: like session
|
|
do
|
|
close_session (req)
|
|
s := new_session (req, False, session_manager)
|
|
req.set_execution_variable (session_request_variable_name, s)
|
|
session := s
|
|
if s.is_pending then
|
|
has_pending_session := True
|
|
end
|
|
ensure
|
|
session_attached: session /= Void
|
|
end
|
|
|
|
get_session (req: WSF_REQUEST)
|
|
-- Get existing session, or start a new one
|
|
local
|
|
s: like session
|
|
do
|
|
if attached {like session} req.execution_variable (session_request_variable_name) as r_session then
|
|
session := r_session
|
|
else
|
|
s := new_session (req, True, session_manager)
|
|
-- create {CMS_SESSION} s.make (req, "_EWF_CMS_SESSID")
|
|
if s.is_pending then
|
|
has_pending_session := True
|
|
end
|
|
session := s
|
|
req.set_execution_variable (session_request_variable_name, s)
|
|
end
|
|
if session.expired then
|
|
start_session (req)
|
|
end
|
|
end
|
|
|
|
close_session (req: WSF_REQUEST)
|
|
-- Close `session' if any
|
|
do
|
|
if session.is_pending then
|
|
has_pending_session := has_pending_session or not discarded_sessions.is_empty
|
|
else
|
|
has_pending_session := True
|
|
discarded_sessions.extend (session)
|
|
end
|
|
session.destroy
|
|
end
|
|
|
|
feature -- Session internal
|
|
|
|
session_manager: WSF_SESSION_MANAGER
|
|
|
|
new_session (req: WSF_REQUEST; a_reuse: BOOLEAN; m: WSF_SESSION_MANAGER): like session
|
|
local
|
|
s: CMS_SESSION
|
|
dt: DATE_TIME
|
|
do
|
|
if a_reuse then
|
|
create s.make (req, session_id_name, m)
|
|
else
|
|
create s.make_new (session_id_name, m)
|
|
create dt.make_now_utc
|
|
dt.day_add (31)
|
|
s.set_expiration (dt)
|
|
end
|
|
Result := s
|
|
end
|
|
|
|
session_request_variable_name: STRING = "_EWF_CMS_SESSION_"
|
|
|
|
session_id_name: STRING = "_EWF_CMS_SESSID"
|
|
|
|
end
|