forked from ring-clojure/ring
-
Notifications
You must be signed in to change notification settings - Fork 6
/
session.clj
53 lines (51 loc) · 2.39 KB
/
session.clj
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
42
43
44
45
46
47
48
49
50
51
52
53
(ns ring.middleware.session
"Session manipulation."
(:use ring.middleware.cookies
[ring.middleware.session store memory]))
(defn wrap-session
"Reads in the current HTTP session map, and adds it to the :session key on
the request. If a :session key is added to the response by the handler, the
session is updated with the new value. If the value is nil, the session is
deleted.
The following options are available:
:store
An implementation of the SessionStore protocol in the
ring.middleware.session.store namespace. This determines how the
session is stored. Defaults to in-memory storage
(ring.middleware.session.store.MemoryStore).
:root
The root path of the session. Any path above this will not be able to
see this session. Equivalent to setting the cookie's path attribute.
Defaults to \"/\".
:cookie-name
The name of the cookie that holds the session key. Defaults to
\"ring-session\"
:cookie-attrs
A map of attributes to associate with the session cookie. Defaults
to {}."
([handler]
(wrap-session handler {}))
([handler options]
(let [store (options :store (memory-store))
cookie-name (options :cookie-name "ring-session")
session-root (options :root "/")
cookie-attrs (merge (options :cookie-attrs) {:path session-root})]
(wrap-cookies
(fn [request]
(let [sess-key (get-in request [:cookies cookie-name :value])
session (read-session store sess-key)
request (assoc request :session session)]
(if-let [response (handler request)]
(let [sess-key* (if (contains? response :session)
(if-let [session (response :session)]
(write-session store sess-key session)
(if sess-key
(delete-session store sess-key))))
response (dissoc response :session)
cookie {cookie-name
(merge cookie-attrs
(response :session-cookie-attrs)
{:value sess-key*})}]
(if (and sess-key* (not= sess-key sess-key*))
(assoc response :cookies (merge (response :cookies) cookie))
response)))))))))