File: xexpr.rkt

package info (click to toggle)
racket 7.9%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 178,684 kB
  • sloc: ansic: 282,112; lisp: 234,887; pascal: 70,954; sh: 27,112; asm: 16,268; makefile: 4,613; cpp: 2,715; ada: 1,681; javascript: 1,244; cs: 879; exp: 499; csh: 422; python: 274; xml: 106; perl: 104
file content (70 lines) | stat: -rw-r--r-- 2,668 bytes parent folder | download | duplicates (5)
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#lang racket/base
(require racket/contract
         racket/list
         racket/match
         xml
         web-server/private/xexpr
         (except-in net/cookies/server
                    make-cookie)
         "request-structs.rkt"
         "cookie.rkt"
         "response-structs.rkt"
         "status-code.rkt")

(module+ test
  (require rackunit))

(define (response/xexpr
         xexpr
         #:code [code 200]
         #:message [message #f]
         #:seconds [seconds (current-seconds)]
         #:mime-type [mime-type TEXT/HTML-MIME-TYPE]
         #:cookies [cooks empty]
         #:headers [hdrs empty]
         #:preamble [preamble #""])
  (response
   code (infer-response-message code message) seconds mime-type
   ; rfc2109 also recommends some cache-control stuff here for cookies
   (append hdrs (map cookie->header cooks))
   (λ (out)
     (write-bytes preamble out)
     (write-xexpr xexpr out))))

(module+ test
  ;; sanity check: we get a response
  (check-true (response? (response/xexpr '(foo))))
  (let ([resp (response/xexpr '(html))])
    ;; no code, no message ==> 200 "OK"
    (check-equal? 200 (response-code resp))
    (check-equal? #"OK" (response-message resp)))
  ;; code present, message absent
  (let ([resp (response/xexpr '(html) #:code 201)])
    (check-equal? 201 (response-code resp))
    (check-equal? #"Created" (response-message resp)))
  ;; unknown status code used, no message
  (let ([resp (response/xexpr '(html) #:code 256)])
    (check-equal? 256 (response-code resp))
    (check-equal? #"OK" (response-message resp)))
  ;; known code used, #f used as message
  (let ([resp (response/xexpr '(html) #:code 204 #:message #f)])
    (check-equal? 204 (response-code resp))
    (check-equal? #"No Content" (response-message resp)))
  ;; known code used, message lookup overridden
  (let ([resp (response/xexpr '(html) #:code 204 #:message #"Cowabunga")])
    (check-equal? 204 (response-code resp))
    (check-equal? #"Cowabunga" (response-message resp)))
  ;; code absent, message #f ==> 200 "OK"
  (let ([resp (response/xexpr '(html) #:message #f)])
    (check-equal? 200 (response-code resp))
    (check-equal? #"OK" (response-message resp)))
  ;; code absent, message present ==> 200 <message>
  (let ([resp (response/xexpr '(html) #:message #"Say Cheese")])
    (check-equal? 200 (response-code resp))
    (check-equal? #"Say Cheese" (response-message resp))))

(provide/contract
 [response/xexpr
  ((pretty-xexpr/c)
   (#:code response-code/c #:message (or/c #f bytes?) #:seconds real? #:mime-type (or/c #f bytes?) #:cookies (listof cookie?) #:headers (listof header?) #:preamble bytes?)
   . ->* . response?)])