blob: 27a6c3189f979bf44b89a7de654c41d73f0a2d07 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
;;;; flash.lisp -- communicating between page loads
(in-package :dnd)
(defvar *flashes*
(make-hash-table :test #'equal :synchronized t))
(defparameter +flash-cookie-name+ "DNDFLASHKEY")
(defparameter +flash-value-lifetime+ 10
"Number of seconds a flashed value lives.")
(defun flash (value)
"A flash is a one-time inter-request value. Once stored, it can only
be retrieved once. And if not retrieved in a short period of time, it
expires."
(let ((key (nuid))
(now (get-universal-time)))
(setf (gethash key *flashes*) (cons value now))
(lzb:set-response-cookie
+flash-cookie-name+ key
;; TODO: generalize domain
:path "/" :domain "localhost"
:expires (+ +flash-value-lifetime+ now))
key))
(defun flashed-value-alive-p (val)
(<= (+ (cdr val) +flash-value-lifetime+)
(get-universal-time)))
(defun flashed-value ()
"Retrieves the value flashed in this request, if it exists, and
returns it.
Removes the flashed value from the hash table if it was found."
(a:when-let* ((key (lzb:request-cookie +flash-cookie-name+))
(val (gethash key *flashes*)))
(remhash key *flashes*)
(when (flashed-value-alive-p val)
(car val))))
|