PNG  IHDR!@ PLTE>O`jqv 7'tEXtPage
cookie.scm - metalympiada
git clone git://metalympiada.org/
Log | Files | README | LICENSE

cookie.scm (3693B)


   1 ;;; guile-webutils -- Web application utilities for Guile
   2 ;;; Copyright © 2016  Christopher Allan Webber <cwebber@dustycloud.org>
   3 (define-module (cookie)
   4   #:export (set-cookie delete-cookie))
   5 (use-modules (srfi srfi-1)
   6              (srfi srfi-19)
   7              (srfi srfi-26)
   8              (ice-9 control)
   9              (ice-9 match)
  10              (web http))
  11 
  12 (define cookie-val-char-set
  13   (char-set-difference (char-set-delete char-set:ascii #\, #\;)
  14                        char-set:iso-control))
  15 
  16 (define cookie-name-char-set
  17   (char-set-delete cookie-val-char-set #\=))
  18 
  19 (define (parse-cookie cookie-text)
  20   (let ((parts (string-split cookie-text #\;)))
  21     (define (split-cookie-pair cookie-pair)
  22       (let* ((trimmed (string-trim cookie-pair))
  23              (delim (string-index trimmed #\=))
  24              (attrib (if delim
  25                          (substring trimmed 0 delim)
  26                          trimmed))
  27              (val (if delim
  28                       (substring trimmed (+ delim 1))
  29                       #t)))
  30         (cons attrib val)))
  31     (map split-cookie-pair parts)))
  32 
  33 (define (date->http-date-string date)
  34   (call-with-output-string (cut (@@ (web http) write-date) date <>)))
  35 
  36 (define (write-cookie cookie-alist port)
  37   (let ((cookie-str
  38          (string-join 
  39           (map (match-lambda
  40                  ((name . (? string? val))
  41                   (string-append name "=" val))
  42                  ((name . (? date? val))
  43                   (string-append name "=" (date->http-date-string val)))
  44                  ((name . #t)
  45                   name))
  46                cookie-alist)
  47           "; ")))
  48     (display cookie-str port)))
  49 
  50 (define (valid-cookie-name? str)
  51   (and (string? str)
  52        (string-every cookie-name-char-set str)))
  53 
  54 (define (valid-cookie-val? str)
  55   (or (eq? str #t)
  56       (and (string? str)
  57            (string-every cookie-val-char-set str))
  58       (date? str)))
  59 
  60 (define (validate-cookie cookie-alist)
  61   (match cookie-alist
  62     ((((? valid-cookie-name? name) . (or #t (? valid-cookie-val? _))) ...)
  63      #t)
  64     (_ #f)))
  65 
  66 (declare-header! "Cookie"
  67                  parse-cookie validate-cookie write-cookie)
  68 
  69 (define (parse-set-cookie str)
  70   (match (parse-cookie str)
  71     (((name . val) attrs ...)
  72      (list name val attrs))))
  73 
  74 (define (validate-set-cookie obj)
  75   (match obj
  76     ((name val (attrs ...))
  77      (validate-cookie
  78       (cons (cons name val)
  79             attrs)))
  80     (_ #f)))
  81 
  82 (define (write-set-cookie obj port)
  83   (match obj
  84     ((name val (attrs ...))
  85      (write-cookie
  86       (cons (cons name val)
  87             attrs)
  88       port))))
  89 
  90 (declare-header! "Set-Cookie"
  91                  parse-set-cookie validate-set-cookie write-set-cookie
  92                  #:multiple? #t)
  93 
  94 (define* (set-cookie name #:optional (val "")
  95                      #:key expires max-age domain
  96                      path secure http-only
  97                      (extensions '())) 
  98   (define (maybe-append name val)
  99     (lambda (prev)
 100       (if val
 101           (cons (cons name val)
 102                 prev)
 103           prev)))
 104   (define basic-prop-alist
 105     ((compose
 106       (maybe-append "Expires" expires)
 107       (maybe-append "Max-Age" max-age)
 108       (maybe-append "Domain" domain)
 109       (maybe-append "Path" path)
 110       (maybe-append "Secure" secure)
 111       (maybe-append "HttpOnly" http-only))
 112      '()))
 113   (define prop-alist
 114     (append basic-prop-alist
 115             extensions))
 116   (cons 'set-cookie (list name val prop-alist)))
 117 
 118 (define %the-epoch
 119   (time-monotonic->date (make-time 'time-monotonic 0 0) 0))
 120 
 121 (define (delete-cookie name)
 122   (set-cookie name
 123               #:expires %the-epoch
 124               #:path "/"
 125               #:secure #t
 126               #:http-only #t))
@JIDATxOlGvƫln,)gZ]*#0cicwBsX9-`}!@89r8􊇨f8 :@.N`{Bb{ב QTޫ!I9Hq7^}{EUz}h?$! 9:$ 򆋣ip^kpA`C%Zi8Jx zG]]^~-Ąw"ZI8|&;ŢMa|.;CټnT ODƁ8mOQ3UVsZ.}XKCo&^)h̷̾#_}~hF d>^Uq]'92 x? #hMHW#{f>KXM#tLa2ـ}|{"pX}sXW_q:nwjdπPnki#3둟)r]d*RI&R@ ez n9<a}@.&X Q%GEfNud~h\V&Ai F!)I vxBӞ9J2^S, \oYt^\5a0}VXE(gTE=a @I_4! Z1ۓ,S5'q)Clu1 `ОlFVׁoE/m:xQᚣ_eS=0#Ol-p25پeg/[L뎹u}.I}j ,9Icwj* `!h&_gW?xG;{sX {̖}.{=yˠG> RNyr>M`&4#3HM*yslKȰ3E<?`~n|{͓8Uyy͙7w~${ʢ깣Hm6kR=nSA͝^k0@%ݻ'׉q4{SLiyp6剒|* ~*@>} kpN^OÓ2 ̨ 0R?5lz.vPڑ;n&1@IaʌαtIEo#d=:5.%iu_{9.k~[o}Pq`X90[_AsqAXE*ϫ vWͽrc}݊3?bzg^ano!5!xrydro8:Q=F})cLncuT-D0C~V$Gm6!T]ݑGhF(K"8UMۉl_c28C|P\#?-xZG!ri3f+I G]N&]_oXGje݉}qTܮ χG4ɜuh&iqxASEETPZ緎l^6JT֡8eQ,|=Aup"%fքC({6J*UPaGmwl&,+r)p?gA̓B.{ 9.{jBfK^62@Ѭ8# -e3Sb ]ƥb6 oǍ;{S[`e} &kOdCMn& E .Meьre0ê:+\pY6?Wm}lB ҁAZ dYɏ'*`CVe~٦Ο>zDo.p+49%1$yY1EUN!c1@˲}+QO` v / W+ܿoAw<[4 28ԗU yN3#q{ W얶8f&-db}Yg]fiΠSv+G)X-#UM 2nBx2| 60[R3@?yL?XMeU~]`A-;;VE4k-`GoH 9# [r.ន!`~9(- :針(wtU6!w!}U PM<Ճţ7|p=UBFl׼sgd˜@+/'c2.EAۅ侷Ȇ1tj:-ވQ{~jVz%ղnȱ:CIu`0Nݐ o51=B۟Ehܩ8BN@?M/.z._VB=6G-ey7Cz{:,)A\i"c>-miq5fh~\ rjT0ڼ[&hN̎ȼCY[=aE7t CR*y=H'Nvfޣwt3lC"0)smThd vP[v9q 6/,3DeK!6NebgahPg&>?iQ a)JEQ88 j#>Z 5S ojP*7JFoex8l%Fe=ֻ\@*0}Zs&v E8qPZ 41FD ?psٙs`ZZ1O S%6+!`r7J,Pn+g2a7Ы[f#yF Tcق2D +K$%Xe>WIs}caPQMV\hp'VK3CQ ٨&wKv̱ۼuU'D3h8XDxƅli q/&wP-:VG$we%.J0%z$iZnҾw͟@#zf0 5{FӮ&7Hmڅt]3A.CTpz4SUeEȻ,`c*fx)}N+7ys1RGR!i;l .ͤQHW`ڪ!EAB'q2y٪9DAFע/\X +t#z'iys%F&~t% i!h+Jv*Z&z'qpxQ)]hQo瑺8QRp<l0:v {Gsy9̘ɮxHLieӾՖˌ%D9Uœb4#q%[Il&P`$ |+Wt:/=7^+.݋k~{`C9[B@A"C+})o6~KSY\qQMVU0v Wk`Qwf{vGz0SL/5XmMnT,0b4H 櫘 BtLԩe v%ך;jÏRYU,,#et&Ȃ{HUAh@a`)%5zҦF&|/[;K?l`bQAτNz>2M` n~14x8cLpM(1X*@]+-*ZD2o :@h I2زﴗC>yF=9tq:t87Z޴佝֏Cś!ꌢ5 KX> 6C)p4՚P61|"%X~3 S+7W]!h1WӐ3GKZ[,R1ju-p |N`M"&vگɇ&p0ށ" julM< /=nGXeڵ[Yd{WuIENDB`