aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/net/alg/http.ey
diff options
context:
space:
mode:
Diffstat (limited to 'elymas/lib/net/alg/http.ey')
-rw-r--r--elymas/lib/net/alg/http.ey46
1 files changed, 46 insertions, 0 deletions
diff --git a/elymas/lib/net/alg/http.ey b/elymas/lib/net/alg/http.ey
new file mode 100644
index 0000000..6f7fe56
--- /dev/null
+++ b/elymas/lib/net/alg/http.ey
@@ -0,0 +1,46 @@
+# provide a http server
+{ <
+ net .alg .bufferedEpollServer "^" via
+
+ <
+ { "request unconfigured (of httpServer)" die } /request deffst
+
+ { = }' /set deffst
+ { scope keys }' /setters deffst
+ { _ ^settings .installSetters =*install
+ setters { _ { set }_ -01 install }" each
+ } /installSetters deffst
+ > _ ==settings "::" via
+
+ { -1010 deffst = }' ::installSetters # TODO: def??? should overwrite existing values
+
+ { ":" via "" ==url "" ==method < { defvst }' /put deffst > ==headers
+ <
+ { :close } _ =*err =*end
+ { ==inBuffer
+ { inBuffer "\n" regex } { [
+ { inBuffer len 2048 gt } { "" =inBuffer :close }
+ { inBuffer "^(GET|POST) ([^\r\n]*) HTTP/\\d\\.\\d\r?\n(.*)" regex } { =method =url =inBuffer }
+ { inBuffer "^([^:\r\n]+): ([^\r\n]*)\r?\n(.*)" regex } { headers .put =inBuffer }
+ { inBuffer "^\r?\n(.*)" regex } { =inBuffer
+ method url headers < ==headers ==url ==method
+ { :close } =*close
+ { :write } =*write
+ { :finish } =*finish
+ { ==contentType
+ "HTTP/1.0 200 Ok\r\nContent-Type: " contentType cat "\r\n\r\n" cat -01 cat :write :finish
+ } =*ok
+ { ==contentType
+ "HTTP/1.0 500 Error\r\nContent-Type: " contentType cat "\r\n\r\n" cat -01 cat :write :finish
+ } =*fail
+ > ::request
+ }
+ { 1 } { "" =inBuffer :close } # TODO: error reporting
+ ] conds } loop inBuffer } =*in
+ >
+ } ^accept
+
+ { ^run } /run deffst
+> } /httpServer net .alg .deff
+
+# vim: syn=elymas