aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/net/alg/http.ey46
-rw-r--r--elymas/lib/net/alg/server.ey6
-rw-r--r--elymas/loaded.ey1
3 files changed, 51 insertions, 2 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
diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey
index 9935016..73ab10c 100644
--- a/elymas/lib/net/alg/server.ey
+++ b/elymas/lib/net/alg/server.ey
@@ -94,13 +94,14 @@
sys .linux .epoll "++" via
- { ":" via "" ==inBuffer "" ==outBuffer
+ { ":" via "" ==inBuffer "" ==outBuffer 0 ==finished
<
{
outBuffer -01 cat =outBuffer
++EPOLLOUT ++EPOLLIN ++EPOLLERR bor bor :ctl
} =*write
{ :close } =*close
+ { 1 =finished } =*finish
> ::accept ":::" via <
{
4096 :read _ len
@@ -111,7 +112,8 @@
{
outBuffer _ :write -01 str .postfix
_ =outBuffer
- len { ++EPOLLOUT } { 0 } ? * ++EPOLLIN ++EPOLLERR bor bor :ctl
+ len _ { ++EPOLLOUT } { 0 } ? * ++EPOLLIN ++EPOLLERR bor bor :ctl
+ not finished and { :close } rep
} =*out
{ :::err } =*err
>
diff --git a/elymas/loaded.ey b/elymas/loaded.ey
index 6cac2a1..c737634 100644
--- a/elymas/loaded.ey
+++ b/elymas/loaded.ey
@@ -11,6 +11,7 @@
"lib/net/dns.ey"
"lib/net/alg.ey"
"lib/net/alg/server.ey"
+ "lib/net/alg/http.ey"
] { _ dump include }' each
{ "/proc/self/fd/0" include }' "loaded" sys .freeze