34 lines
1.1 KiB
Racket
34 lines
1.1 KiB
Racket
#lang racket/base
|
|
(require racket/contract
|
|
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?])
|