49 lines
1.8 KiB
Racket
49 lines
1.8 KiB
Racket
#lang racket/base
|
|
(require racket/contract
|
|
web-server/http/request-structs)
|
|
|
|
(define TEXT/HTML-MIME-TYPE #"text/html; charset=utf-8")
|
|
|
|
(struct response (code message seconds mime headers output))
|
|
|
|
(define (response/full code message seconds mime headers body)
|
|
(response code message seconds mime
|
|
(list* (make-header #"Content-Length"
|
|
(string->bytes/utf-8
|
|
(number->string
|
|
(for/fold ([len 0])
|
|
([b (in-list body)])
|
|
(+ len (bytes-length b))))))
|
|
headers)
|
|
(lambda (op)
|
|
(for ([b (in-list body)])
|
|
(write-bytes b op)))))
|
|
|
|
(define (response/output output
|
|
#:code [code 200]
|
|
#:message [message #"Okay"]
|
|
#:seconds [seconds (current-seconds)]
|
|
#:mime-type [mime-type TEXT/HTML-MIME-TYPE]
|
|
#:headers [headers '()])
|
|
(response code message seconds mime-type headers
|
|
output))
|
|
|
|
|
|
(provide/contract
|
|
[struct response
|
|
([code number?]
|
|
[message bytes?]
|
|
[seconds number?]
|
|
[mime (or/c false/c bytes?)]
|
|
[headers (listof header?)]
|
|
[output (output-port? . -> . void)])]
|
|
[response/full (-> number? bytes? number? (or/c false/c bytes?) (listof header?) (listof bytes?) response?)]
|
|
[response/output (->* ((-> output-port? void?))
|
|
(#:code number?
|
|
#:message bytes?
|
|
#:seconds number?
|
|
#:mime-type (or/c bytes? #f)
|
|
#:headers (listof header?))
|
|
response?)]
|
|
[TEXT/HTML-MIME-TYPE bytes?])
|