A session-leader doesn't have to be a resource anymore. Added

session-leader-resource for those relying on the old behaviour.
This commit is contained in:
2001-03-28 05:49:10 +00:00
parent 9eeeeda3c7
commit 69f36101c9

View File

@ -16,7 +16,7 @@
;;; Ephemeral cookie-based session management ;;; Ephemeral cookie-based session management
(defclass session-leader (resource) (defclass session-leader ()
((sessions :initform (make-hash-table :test #'equal) ((sessions :initform (make-hash-table :test #'equal)
:reader session-leader-sessions) :reader session-leader-sessions)
(session-name :initform "SESSIONID" :initarg :session-name (session-name :initform "SESSIONID" :initarg :session-name
@ -40,10 +40,6 @@ session id, which is then returned."))
(setf (gethash new-id (session-leader-sessions leader)) data) (setf (gethash new-id (session-leader-sessions leader)) data)
new-id)) new-id))
(defgeneric session-leader-process-login (leader request)
(:documentation
"Process the :post request to handle a login."))
(defmacro with-new-session ((leader data) &body body) (defmacro with-new-session ((leader data) &body body)
`(let ((leader ,leader) `(let ((leader ,leader)
(data ,data) (data ,data)
@ -55,24 +51,20 @@ session id, which is then returned."))
(session-leader-session-path leader)))) (session-leader-session-path leader))))
result)) result))
(defmethod access-resource-using-method
((resource session-leader) request (method (eql :POST)))
(session-leader-process-login resource request))
(defgeneric get-session-data (leader request) (defgeneric get-session-data (leader request)
(:documentation (:documentation
"Lookup a possible session-data item bound to the session id that "Lookup a possible session-data item bound to the session id that
is included in a Cookie header in the given request. Returns nil of is included in a Cookie header in the given request. Returns nil of
no corresponding session-data item can be found.")) no corresponding session-data item can be found."))
(defmethod get-session-data ((resource session-leader) request) (defmethod get-session-data ((leader session-leader) request)
(when (header-exists-p request 'cookie) (when (header-exists-p request 'cookie)
(let* ((session-name (session-leader-session-name resource)) (let* ((session-name (session-leader-session-name leader))
(cookie (assoc session-name (header-value request 'cookie) (cookie (assoc session-name (header-value request 'cookie)
:test #'string-equal))) :test #'string-equal)))
(when cookie (when cookie
(gethash (cdr cookie) (gethash (cdr cookie)
(session-leader-sessions resource) (session-leader-sessions leader)
nil))))) nil)))))
(defclass sessioned-resource (resource) (defclass sessioned-resource (resource)
@ -101,3 +93,16 @@ is invoked to handle the request."
(if ,var (if ,var
(progn ,@body) (progn ,@body)
(handle-missing-session ,res-var ,req-var))))) (handle-missing-session ,res-var ,req-var)))))
;;; Hack for limited backwards compatability
(defclass session-leader-resource (resource session-leader)
())
(defgeneric session-leader-process-login (leader request)
(:documentation
"Process the :post request to handle a login."))
(defmethod access-resource-using-method
((resource session-leader-resource) request (method (eql :POST)))
(session-leader-process-login resource request))