diff options
| author | Drahflow <drahflow@gmx.de> | 2013-09-04 01:55:51 +0200 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2013-09-04 01:55:51 +0200 |
| commit | 3fb7dd375ada97b9413abfecccd8a889c53dc93a (patch) | |
| tree | 583915d9624b8892519334023282ab99b2ead632 /elymas/lib | |
| parent | 20efe1efeb3c62b884ccc16fd77e3b4c430c3ed9 (diff) | |
Minimal HTTP server
Diffstat (limited to 'elymas/lib')
| -rw-r--r-- | elymas/lib/net/alg/http.ey | 46 | ||||
| -rw-r--r-- | elymas/lib/net/alg/server.ey | 6 |
2 files changed, 50 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 > |
