17 | record Response where
20 | content : List ByteString
24 | empty = RP emptyHeaders []
27 | addHeader : String -> ByteString -> Response -> Response
28 | addHeader x y = {headers $= insertHeader x y}
31 | setStatus : Status -> Response -> Response
32 | setStatus s = addHeader "Status" (cast s)
38 | responseBytes : Response -> List ByteString
39 | responseBytes (RP hs bs) =
41 | [] => crlf :: crlf :: bs
42 | ps => (ps >>= \(h,v) => [fromString h,":",v,crlf]) ++ crlf :: bs
45 | setContentType : EncodeVia f t -> Response -> Response
46 | setContentType e = addHeader Content_Type (encodeMediaType $
mediaType @{e})
53 | -> All (EncodeVia t) ts
56 | encodeBody s v hs [] rs = setStatus s rs
57 | encodeBody s v hs (e :: es) rs =
58 | case acceptsMedia hs (mediaType @{e}) of
59 | False => encodeBody s v hs es rs
60 | True => {content := encodeVia v e} rs |> setContentType e |> setStatus s
66 | encErr : All (EncodeVia RequestErr) [JSON, Text]
70 | fromError : Maybe URI -> Headers -> RequestErr -> Response
71 | fromError mu hs re@(RE st err _ _ _) =
72 | let u := maybe "" interpolate mu
73 | in encodeBody (MkStatus st err) ({path := u} re) hs encErr empty
76 | fromStatus : URI -> Headers -> Status -> Response
77 | fromStatus u hs = fromError (Just u) hs . requestErr
80 | notFound : URI -> Headers -> Response
81 | notFound u hs = fromStatus u hs notFound404
84 | forbidden : URI -> Headers -> Response
85 | forbidden u hs = fromStatus u hs forbidden403