User Tools

Site Tools



This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lecture:ring:srcs [2014/04/05 10:54]
psk810 [wrap-session]
lecture:ring:srcs [2019/02/04 14:26] (current)
Line 725: Line 725:
         cookies/​cookies-response))) ​     ​         cookies/​cookies-response))) ​     ​
 </​code>​ </​code>​
 +session-request와 session-response 함수는 각각 cookis의 cookies-request와 cookies-response 함수를 호출하는데,​ 이 함수들은 request에 이미 :cookies 키가 있으면 그냥 리턴하기 때문에, wrap-session은 wrap-cookies와 충돌하지 않는다. 사실 wrap-session을 하면 wrap-cookies는 하지 않아도 된다.
 +세션에 관한 실제 작업은 bare-session-request와 bare-session-response 함수에서 한다.
 +<code clojure>
 +(defn- bare-session-request
 +  [request & [{:keys [store cookie-name]}]]
 +  (let [req-key ​ (get-in request [:cookies cookie-name :value])
 +        session ​ (store/​read-session store req-key)
 +        session-key (if session req-key)]
 +    (merge request {:session (or session {})
 +                    :​session/​key session-key})))
 +bare-session-request 함수는 쿠키값을 읽은 다음 그것을 키로해서 세션 스토어에서 세션값을 찾아서 요청맵에 :session 키를 만들어 세션값을 설정한다. 또한 쿠키값은 세션 스토어에서 키로 사용되기 때문에 :​session/​key 키에 값으로 설정한다.
 +<code clojure>
 +(defn- bare-session-response
 +  [response {session-key :​session/​key} ​ & [{:keys [store cookie-name cookie-attrs]}]]
 +  (let [new-session-key (if (contains? response :session)
 +                          (if-let [session (response :session)]
 +                            (store/​write-session store session-key session)
 +                            (if session-key
 +                              (store/​delete-session store session-key))))
 +        session-attrs (:​session-cookie-attrs response)
 +        cookie {cookie-name
 +                (merge cookie-attrs
 +                       ​session-attrs
 +                       ​{:​value (or new-session-key session-key)})}
 +        response (dissoc response :session :​session-cookie-attrs)]
 +    (if (or (and new-session-key (not= session-key new-session-key))
 +            (and session-attrs (or new-session-key session-key)))
 +      (assoc response :cookies (merge (response :cookies) cookie))
 +      response)))
 +bare-session-response는 응답맵에 :session 키와 그 값이 있으면 세션 스토어에 :​session/​key를 키로해서 넣고, :session 키는 있는데 그 값이 없으면 세션 스토어에서 :​session/​key 키를 제거한다.
 +응답맵에서 :​session-cookie-attrs를 읽어서 cookie의 속성으로 설정하고 쿠키값으로는 new-session-key와 session-key로 한다. 그리고 응답맵에서 :session과 :​session-cookie-attrs를 제거한다.
lecture/ring/srcs.txt · Last modified: 2019/02/04 14:26 (external edit)