64 lines
2.6 KiB
Scheme
64 lines
2.6 KiB
Scheme
(module helpers mzscheme
|
|
(require (lib "contract.ss")
|
|
(lib "kw.ss")
|
|
(lib "plt-match.ss"))
|
|
(require "../private/util.ss"
|
|
"../private/request-structs.ss"
|
|
"../private/response-structs.ss")
|
|
|
|
(define (request-headers request)
|
|
(map (match-lambda
|
|
[(struct header (field value))
|
|
(cons (lowercase-symbol! (bytes->string/utf-8 field))
|
|
(bytes->string/utf-8 value))])
|
|
(request-headers/raw request)))
|
|
(define (request-bindings request)
|
|
(map (match-lambda
|
|
[(struct binding:form (id value))
|
|
(cons (lowercase-symbol! (bytes->string/utf-8 id))
|
|
(bytes->string/utf-8 value))]
|
|
[(struct binding:file (id fname value))
|
|
(cons (lowercase-symbol! (bytes->string/utf-8 id))
|
|
value)])
|
|
(request-bindings/raw request)))
|
|
|
|
; redirection-status = (make-redirection-status nat str)
|
|
(define-struct redirection-status (code message))
|
|
|
|
(define permanently (make-redirection-status 301 "Moved Permanently"))
|
|
(define temporarily (make-redirection-status 302 "Moved Temporarily"))
|
|
(define see-other (make-redirection-status 303 "See Other"))
|
|
|
|
; : str [redirection-status] -> response
|
|
(define/kw (redirect-to uri
|
|
#:optional
|
|
[perm/temp permanently]
|
|
#:key
|
|
[headers (list)])
|
|
(make-response/full (redirection-status-code perm/temp)
|
|
(redirection-status-message perm/temp)
|
|
(current-seconds) #"text/html"
|
|
`((Location . ,uri) ,@headers) (list)))
|
|
|
|
; with-errors-to-browser
|
|
; to report exceptions that occur later to the browser
|
|
; this must be called at the begining of a servlet
|
|
(define (with-errors-to-browser send/finish-or-back thunk)
|
|
(with-handlers ([exn? (lambda (exn)
|
|
(send/finish-or-back
|
|
`(html (head (title "Servlet Error"))
|
|
(body ([bgcolor "white"])
|
|
(p "The following error occured: "
|
|
(pre ,(exn->string exn)))))))])
|
|
(thunk)))
|
|
|
|
(provide
|
|
with-errors-to-browser
|
|
redirect-to)
|
|
(provide/contract
|
|
[permanently redirection-status?]
|
|
[temporarily redirection-status?]
|
|
[see-other redirection-status?]
|
|
[request-bindings (request? . -> . (listof (or/c (cons/c symbol? string?)
|
|
(cons/c symbol? bytes?))))]
|
|
[request-headers (request? . -> . (listof (cons/c symbol? string?)))])) |