1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
#lang racket/base
(require racket/contract
(only-in racket/string non-empty-string?)
web-server/private/util
web-server/http/response-structs
web-server/http/request-structs)
; redirection-status = (make-redirection-status nat bytes)
(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 (redirect-to
uri
[perm/temp temporarily]
#:headers [headers (list)])
(response (redirection-status-code perm/temp)
(redirection-status-message perm/temp)
(current-seconds) #"text/html"
(list* (make-header #"Location" (string->bytes/utf-8 uri))
headers)
void))
(provide/contract
[redirect-to
(->* (non-empty-string?) (redirection-status? #:headers (listof header?))
response?)]
[redirection-status? (any/c . -> . boolean?)]
[permanently redirection-status?]
[temporarily redirection-status?]
[see-other redirection-status?])
|