[plt-scheme] cookies in plt web server
On Fri, 14 Jan 2005 11:59:26 -0500, Larry White <ljw1001 at gmail.com> wrote:
> I understand that one can set cookies in the plt web-server using
> "extras" in make-response/full, but that seems to be as far as the
> documentation goes. Does anyone have an example of setting and
> reading cookies that they would pass along?
Fill in lookup-pw, uid->sid, save-sid!, and lookup-uid for your database.
; start : request -> response
(define (start initial-request)
(define uid (request->uid initial-request))
(cond
[uid `(html (body "Already logged in."))]
[(let ([b (request-bindings initial-request)])
(login (extract-binding/single 'user b)
(extract-binding/single 'password b)))
=>
(lambda (session-id)
(make-response/full 200 "OK" (current-seconds) #"text/html"
`((Set-Cookie . ,(print-cookie (cookie:add-path
(set-cookie "session"
session-id)
"/"))))
(list "<html><body>Logged in.</body></html>")))]
[else `(html (body "Login incorrect."))]))
(define (login user pw)
(define uid (lookup-uid user))
(and uid
(string=? pw (lookup-pw uid))
(generate-session-id uid)))
(define (generate-session-id uid)
(define sid (format "~a~a" (gensym (lookup-username uid)) (random 3000)))
(save-sid! uid sid)
sid)
;; if the request has a valid UID and SID, then return the UID
;; else return false
(define (request->uid request)
(define-values (uid sid) (request->uid&sid request))
(define saved-sid (uid->sid uid))
(and saved-sid
(string=? sid saved-sid)
uid))
(require (rename (lib "request-parsing.ss" "web-server")
request-headers request-headers))
(define (request->uid&sid request)
(cond
[(assq 'cookie (request-headers request))
=> (match-lambda
[(list-rest 'cookie cookies)
(let ([c (bytes->string/utf-8 cookies)])
(values (get-cookie/single "uid" c)
(get-cookie/single "session" c)))])]
[else (values #f #f)]))
Daniel