racket/collects/web-server/http/response-structs.rkt
2013-04-02 21:26:32 -05:00

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?])