aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/world/net/http/response.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/world/net/http/response.lux')
-rw-r--r--stdlib/source/library/lux/world/net/http/response.lux74
1 files changed, 74 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/world/net/http/response.lux b/stdlib/source/library/lux/world/net/http/response.lux
new file mode 100644
index 000000000..0ca825a44
--- /dev/null
+++ b/stdlib/source/library/lux/world/net/http/response.lux
@@ -0,0 +1,74 @@
+(.module:
+ [library
+ [lux (#- static)
+ [control
+ [concurrency
+ ["." promise]
+ ["." frp ("#\." monad)]]]
+ [data
+ ["." text
+ ["." encoding]]
+ [format
+ ["." html]
+ ["." css (#+ CSS)]
+ ["." context]
+ ["." json (#+ JSON) ("#\." codec)]]]
+ ["." io]
+ [world
+ ["." binary (#+ Binary)]]]]
+ ["." // (#+ Status Body Response Server)
+ ["." status]
+ ["." mime (#+ MIME)]
+ ["." header]
+ [// (#+ URL)]])
+
+(def: #export (static response)
+ (-> Response Server)
+ (function (_ request)
+ (promise.resolved response)))
+
+(def: #export empty
+ (-> Status Response)
+ (let [body (frp\wrap (\ encoding.utf8 encode ""))]
+ (function (_ status)
+ [status
+ {#//.headers (|> context.empty
+ (header.content-length 0)
+ (header.content-type mime.utf-8))
+ #//.body body}])))
+
+(def: #export (temporary-redirect to)
+ (-> URL Response)
+ (let [[status message] (..empty status.temporary-redirect)]
+ [status (update@ #//.headers (header.location to) message)]))
+
+(def: #export not-found
+ Response
+ (..empty status.not-found))
+
+(def: #export (content status type data)
+ (-> Status MIME Binary Response)
+ [status
+ {#//.headers (|> context.empty
+ (header.content-length (binary.size data))
+ (header.content-type type))
+ #//.body (frp\wrap data)}])
+
+(def: #export bad-request
+ (-> Text Response)
+ (|>> (\ encoding.utf8 encode) (content status.bad-request mime.utf-8)))
+
+(def: #export ok
+ (-> MIME Binary Response)
+ (content status.ok))
+
+(template [<name> <type> <mime> <pre>]
+ [(def: #export <name>
+ (-> <type> Response)
+ (|>> <pre> (\ encoding.utf8 encode) (..ok <mime>)))]
+
+ [text Text mime.utf-8 (<|)]
+ [html html.Document mime.html html.html]
+ [css CSS mime.css css.css]
+ [json JSON mime.json json\encode]
+ )