18 | record Response where
21 | content : List ByteString
25 | empty = RP emptyHeaders []
28 | addHeader : String -> ByteString -> Response -> Response
29 | addHeader x y = {headers $= insertHeader x y}
32 | setStatus : Status -> Response -> Response
33 | setStatus s = addHeader "Status" (cast s)
39 | responseBytes : Response -> List ByteString
40 | responseBytes (RP hs bs) =
42 | [] => crlf :: crlf :: bs
43 | ps => (ps >>= \(h,v) => [fromString h,":",v,crlf]) ++ crlf :: bs
46 | setContentType : EncodeVia f t -> Response -> Response
47 | setContentType e = addHeader Content_Type (encodeMediaType $
mediaType @{e})
54 | -> All (EncodeVia t) ts
57 | encodeBody s v hs [] rs = setStatus s rs
58 | encodeBody s v hs (e :: es) rs =
59 | case acceptsMedia hs (mediaType @{e}) of
60 | False => encodeBody s v hs es rs
61 | True => {content := encodeVia v e} rs |> setContentType e |> setStatus s
67 | parameters {auto loc : HTTPLocal}
68 | encErr : All (EncodeVia RequestErr) [JSON, Text]
72 | fromError : Maybe URI -> Headers -> RequestErr -> Response
73 | fromError mu hs re@(RE st err _ _ _) =
74 | let u := maybe "" interpolate mu
75 | in encodeBody (MkStatus st err) ({path := u} re) hs encErr empty
78 | fromStatus : URI -> Headers -> Status -> Response
79 | fromStatus u hs = fromError (Just u) hs . requestErr
82 | notFound : URI -> Headers -> Response
83 | notFound u hs = fromStatus u hs notFound404
86 | forbidden : URI -> Headers -> Response
87 | forbidden u hs = fromStatus u hs forbidden403