Skip to content

Commit 7ce01f8

Browse files
committed
Add spaces after semicolons in Set-Cookie header
Fixes #486.
1 parent 81f136f commit 7ce01f8

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

ring-core/src/ring/middleware/cookies.clj

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,12 +106,12 @@
106106
(for [[key value] attrs]
107107
(let [attr (name (set-cookie-attrs key))]
108108
(cond
109-
(satisfies? CookieInterval value) (str ";" attr "=" (->seconds value))
110-
(satisfies? CookieDateTime value) (str ";" attr "=" (rfc822-format value))
111-
(true? value) (str ";" attr)
109+
(satisfies? CookieInterval value) (str "; " attr "=" (->seconds value))
110+
(satisfies? CookieDateTime value) (str "; " attr "=" (rfc822-format value))
111+
(true? value) (str "; " attr)
112112
(false? value) ""
113-
(= :same-site key) (str ";" attr "=" (same-site-values value))
114-
:else (str ";" attr "=" value)))))
113+
(= :same-site key) (str "; " attr "=" (same-site-values value))
114+
:else (str "; " attr "=" value)))))
115115

116116
(defn- write-cookies [cookies encoder]
117117
(for [[key value] cookies]

ring-core/test/ring/middleware/test/cookies.clj

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
(:headers resp)))))
4848

4949
(defn- split-set-cookie [headers]
50-
(letfn [(split-header [v] (set (mapcat #(str/split % #";") v)))]
50+
(letfn [(split-header [v] (set (mapcat #(str/split % #"; ?") v)))]
5151
(update-in headers ["Set-Cookie"] split-header)))
5252

5353
(deftest wrap-cookies-set-extra-attrs
@@ -169,6 +169,18 @@
169169
0 0 0 0
170170
(ZoneId/of "UTC")))
171171

172+
(deftest wrap-cookies-spaces-after-semicolons-test
173+
(let [cookies {"a" {:value "b"
174+
:path "/", :secure true, :same-site :lax
175+
:expires (zoned-date-time 2015 12 31)
176+
:max-age (Duration/between (zoned-date-time 2012)
177+
(zoned-date-time 2015))}}
178+
handler (constantly {:cookies cookies})
179+
resp ((wrap-cookies handler) {})
180+
header (first (get-in resp [:headers "Set-Cookie"]))]
181+
(is (re-matches #"([^;]+; )+([^;]+)" header)
182+
"spaces after semicolons in Set-Cookie")))
183+
172184
(deftest wrap-cookies-accepts-max-age-from-java-time
173185
(let [cookies {"a" {:value "b", :path "/",
174186
:secure true, :http-only true,

0 commit comments

Comments
 (0)