User Tools

Site Tools


lecture:ring:srcs

Differences

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})))
 +</​code>​
 +
 +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)))
 +</​code>​
 +
 +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)