{ { T{ cookie { name "__s" } { value "12345567" } } } }
[ "__s=12345567;" parse-cookie ]
unit-test
+
+{ { T{ cookie { name "a:b" } { value "c" } } } }
+[ "a:b=c;" parse-cookie ]
+unit-test
+
+{ { T{ cookie { name "d" } { value "[e]" } } } }
+[ "d=[e];" parse-cookie ]
+unit-test
+
+! Don't stop parsing on just one bad cookie
+{
+ {
+ T{ cookie { name "d" } { value "[e]" } }
+ T{ cookie { name "g" } { value "h" } }
+ }
+} [ "d=[e]; a: ; g=h;" parse-cookie ] unit-test
+
+! Don't stop parsing on just one bad cookie
+{
+ {
+ T{ cookie { name "d" } { value "[e]" } }
+ T{ cookie { name "g" } { value "h" } }
+ }
+} [ "d=[e]; a: ; g=h;" parse-cookie ] unit-test
+
+! Add some cookies with extra features
+{
+ V{ "set-cookie" "mykey=myvalue; SameSite=Strict" }
+}
+[ "Set-Cookie: mykey=myvalue; SameSite=Strict" parse-header-line ] unit-test
+
+{
+ V{
+ "set-cookie"
+ "id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly"
+ }
+}
+[ "Set-Cookie: id=a3fWa; Expires=Thu, 21 Oct 2021 07:28:00 GMT; Secure; HttpOnly" parse-header-line ] unit-test
+
+! python allowed characters in key name
+{
+ { T{ cookie { name "!#$%&'*+-.^_`|~:abc" } { value "def" } } }
+} [
+ "!#$%&'*+-.^_`|~:abc=def;" parse-cookie
+] unit-test
\ No newline at end of file
: except-these ( quots -- parser )
[ 1|| ] curry except ; inline
+: cookie-key-disallow? ( ch -- ? )
+ " \t,;=" member? ;
+
: tspecial? ( ch -- ? )
"()<>@,;:\\\"/[]?={} \t" member? ;
+: cookie-key-parser ( -- parser )
+ { [ control? ] [ cookie-key-disallow? ] } except-these repeat1 ;
+
: token-parser ( -- parser )
{ [ control? ] [ tspecial? ] } except-these repeat1 ;
2choice case-sensitive ;
: attr-parser ( -- parser )
- token-parser case-sensitive ;
+ cookie-key-parser case-sensitive ;
: av-pair-parser ( -- parser )
[