I have an application that has a notion of a current user that is lazily established on a per-request basis. For now, I have been returning a handler that is really a lambda wrapping a real handler that lexically binds the special *current-user*:
(defun page-handler (request) (multiple-value-bind (handler foundp) (gethash (script-name request) *handlers*) (when foundp (lambda () (let ((*current-user* *current-user-local-unbound-value*)) (funcall handler))))))
But it occurred to me that there is already the *request* structure. Would it make sense to be able to have a table of arbitrary keys and values in the request structure for application use? I was thinking of an accessor like this:
request-data key &optional (request *request*) => value, foundp
Then I could write CURRENT-USER something like:
(defun current-user () (multiple-value-bind (value foundp) (request-data 'user) (if foundp value (setf (request-data 'user) (cookie-user)))))
Right now it's a bit messier than that.
What do you think? If this seems reasonable I can work out and submit a patch.
Zach