diff options
| author | Drahflow <drahflow@gmx.de> | 2014-03-02 00:24:20 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-03-02 00:24:20 +0100 |
| commit | e9f4e9e2992870920dafe0abc7418d8ea7f42a29 (patch) | |
| tree | c6915481fba8e84b386d5718ae8ea7e11d5218ac /elymas | |
| parent | b2150cc0d050522acae179a891c69bab01581061 (diff) | |
Now using the error library
Diffstat (limited to 'elymas')
| -rw-r--r-- | elymas/lib/net/alg/http.ey | 16 | ||||
| -rw-r--r-- | elymas/lib/net/alg/server.ey | 261 | ||||
| -rw-r--r-- | elymas/lib/net/tcp.ey | 15 | ||||
| -rw-r--r-- | elymas/loaded.ey | 1 | ||||
| -rw-r--r-- | elymas/shared.ey | 1 |
5 files changed, 157 insertions, 137 deletions
diff --git a/elymas/lib/net/alg/http.ey b/elymas/lib/net/alg/http.ey index 1238bcf..fcb3993 100644 --- a/elymas/lib/net/alg/http.ey +++ b/elymas/lib/net/alg/http.ey @@ -35,12 +35,19 @@ } =*fail > ::request } - { 1 } { "" =inBuffer :close } # TODO: error reporting + { 1 } { + "HTTP/1.0 400 Error\r\nContent-Type: text/html\r\n\r\n<html><body>Could not parse request</body></html>\r\n" + :write :finish + } ] conds } loop inBuffer } =*in > } ^accept - { ^run } /run deffst + { + { ^run } { + _ .?close { .close } { ??!' } ? * + } ?!io.net + } /run deffst > } /rawHttpServer net .alg .deff { < @@ -68,10 +75,7 @@ } each } rep - url args - < req keys { _ { : }_ -01 deffst }' each # TODO: this forwarding logic seems ugly, find a better way to forward activity levels - ==args { }_ =url - > ::request + url args < ==args ==url req >' ::request } ^request { ^run } /run deffst diff --git a/elymas/lib/net/alg/server.ey b/elymas/lib/net/alg/server.ey index 7dc502a..39e42fb 100644 --- a/elymas/lib/net/alg/server.ey +++ b/elymas/lib/net/alg/server.ey @@ -1,131 +1,142 @@ # provide a standard epoll-based tcp/ip server -{ < - < - { 1 } /running deffst - { 1000000 } /interval deffst - { "unconfigured accept (of epollServer)" die } /accept deffst - { "unconfigured port (of epollServer)" die } /port deffst - - { = }' /set deffst - { scope keys }' /setters deffst - { =*install - setters { _ { set }_ -01 install }" each - } /installSetters deffst - > _ ==settings "::" via - - { deffst }' ::installSetters - - sys .linux "+" via +epoll "++" via - sys .asm "+!" via - net .tcp "+:" via - - < > ==:noHandler - - { - ::port +:listenFd ==listenFd - - [ ] ==allEventHandlers - { ==fd ==handler - { allEventHandlers len fd le }' { - allEventHandlers [ noHandler ] cat =allEventHandlers - } loop - handler fd allEventHandlers =[] - } /protectGC deffst - { ==fd noHandler fd allEventHandlers =[] } /unprotectGC deffst +< + { ==err _ 0 lt { err ?? } rep } "+??" deffd + { ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd + { < < - { - listenFd +:acceptFd ==fd - - < - { - epoll ++EPOLLCTLDEL fd 0 0 ++ctl - fd +close - fd unprotectGC - } /close deffst - { ==count - count str .alloc ==buf - fd buf count +read - _ 0 lt { "read failed" die } rep # TODO: real error handling - buf str .inplacePrefix - } /read deff - { ==buf - fd buf _ len +write - _ 0 lt { "write failed" die } rep # TODO: real error handling - } /write deff - { ==flags - epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl - } /ctl deffst - > ::accept ==eventHandler - - epoll ++EPOLLCTLADD fd ++EPOLLIN ++EPOLLERR bor eventHandler +!rawAddress ++ctl - eventHandler fd protectGC - } =*in - { "unexpected output capability on listening socket" die } =*out - { "error on main server socket" die } =*err - > ==listenFdEventHandler - - listenFdEventHandler listenFd protectGC - - ++create ==epoll - epoll ++EPOLLCTLADD listenFd ++EPOLLIN listenFdEventHandler +!rawAddress ++ctl - - { ::running } { - epoll 16 ::interval ++wait -- # TODO: error handling - { - _ .data +!rawObject ":" via - .events - _ ++EPOLLIN band not not { :in } rep - _ ++EPOLLOUT band not not { :out } rep - ++EPOLLERR band not not { :err } rep - } each - } loop - } /run deffst -> } /epollServer net .alg .deff - -{ < - net .alg .epollServer "^" via - - < - { "unconfigured accept (of bufferedEpollServer)" die } /accept deffst - - { = }' /set deffst - { scope keys }' /setters deffst - { _ ^settings .installSetters =*install - setters { _ { set }_ -01 install }" each - } /installSetters deffst - > _ ==settings "::" via - - { deffst }' ::installSetters - - sys .linux .epoll "++" via - - { ":" via "" ==inBuffer "" ==outBuffer 0 ==finished + { 1 } /running deffst + { 1000000 } /interval deffst + { "unconfigured accept (of epollServer)" die } /accept deffst + { "unconfigured port (of epollServer)" die } /port deffst + + { = }' /set deffst + { scope keys }' /setters deffst + { =*install + setters { _ { set }_ -01 install }" each + } /installSetters deffst + > _ ==settings "::" via + + { deffst }' ::installSetters + + sys .linux "+" via +epoll "++" via + sys .asm "+!" via + net .tcp "+:" via + + < > ==:noHandler + + { + ::port +:listenFd ==listenFd + + [ ] ==allEventHandlers + { ==fd ==handler + { allEventHandlers len fd le }' { + allEventHandlers [ noHandler ] cat =allEventHandlers + } loop + handler fd allEventHandlers =[] + } /protectGC deffst + { ==fd noHandler fd allEventHandlers =[] } /unprotectGC deffst + + < + { + listenFd +:acceptFd +??io.net.accept ==fd + + < + { + epoll ++EPOLLCTLDEL fd 0 0 ++ctl +??io.net.epoll -- + fd +close +??io.net.close -- + fd unprotectGC + } /close deffst + { ==count + count str .alloc ==buf + fd buf count +read + |close < { 0 } ; =*close > +???io.net.con.read + buf str .inplacePrefix + } /read deff + { ==buf + fd buf _ len +write + |close < =*close > +???io.net.con.write + } /write deff + { ==flags + epoll ++EPOLLCTLMOD fd flags eventHandler +!rawAddress ++ctl +??io.net.epoll -- + } /ctl deffst + > ::accept ==eventHandler + + epoll ++EPOLLCTLADD fd ++EPOLLIN ++EPOLLERR bor eventHandler +!rawAddress ++ctl +??io.net.epoll -- + eventHandler fd protectGC + } =*in + { "unexpected output capability on listening socket" die } =*out + { ??io.net } =*err + > ==listenFdEventHandler + + listenFdEventHandler listenFd protectGC + + ++create +??io.net.epoll ==epoll + epoll ++EPOLLCTLADD listenFd ++EPOLLIN listenFdEventHandler +!rawAddress ++ctl +??io.net.epoll -- + + { ::running } { + epoll 16 ::interval ++wait +??io.net.wait -- + { + _ .data +!rawObject ":" via + .events + _ ++EPOLLIN band not not { :in } rep + _ ++EPOLLOUT band not not { :out } rep + ++EPOLLERR band not not { :err } rep + } each + } loop + } /run deffst + > } /epollServer net .alg .deff + + { < + net .alg .epollServer "^" via + < - { - outBuffer -01 cat =outBuffer - ++EPOLLOUT ++EPOLLIN ++EPOLLERR bor bor :ctl - } =*write - { :close } =*close - { 1 =finished } =*finish - > ::accept ":::" via < - { - 4096 :read _ len - { inBuffer -01 cat :::in =inBuffer } - { -- :::end } - ? * - } =*in - { - outBuffer _ :write -01 str .postfix - _ =outBuffer - len _ { ++EPOLLOUT } { 0 } ? * ++EPOLLIN ++EPOLLERR bor bor :ctl - not finished and { :close } rep - } =*out - { :::err } =*err - > - } ^accept - - { ^run } /run deffst -> } /bufferedEpollServer net .alg .deff + { "unconfigured accept (of bufferedEpollServer)" die } /accept deffst + { 1048576 } /outputBufferLimit deffst + + { = }' /set deffst + { scope keys }' /setters deffst + { _ ^settings .installSetters =*install + setters { _ { set }_ -01 install }" each + } /installSetters deffst + > _ ==settings "::" via + + { deffst }' ::installSetters + + sys .linux .epoll "++" via + + { ":" via "" ==inBuffer "" ==outBuffer 0 ==finished + < + { + outBuffer -01 cat _ =outBuffer + len ::outputBufferLimit gt { + |close < =*close + { ::outputBufferLimit 2 mul outputBufferLimit } =*increase + > ???limit.io.out + } rep + ++EPOLLOUT ++EPOLLIN ++EPOLLERR bor bor :ctl + } =*write + { :close } =*close + { 1 =finished } =*finish + > ::accept ":::" via < + { + 4096 :read _ len + { inBuffer -01 cat :::in =inBuffer } + { -- :::end } + ? * + } =*in + { + outBuffer _ :write -01 str .postfix + _ =outBuffer + len _ { ++EPOLLOUT } { 0 } ? * ++EPOLLIN ++EPOLLERR bor bor :ctl + not finished and { :close } rep + } =*out + { :::err } =*err + > + } ^accept + + { ^run } /run deffst + > } /bufferedEpollServer net .alg .deff +> -- # vim: syn=elymas diff --git a/elymas/lib/net/tcp.ey b/elymas/lib/net/tcp.ey index e7ef31e..7fcc194 100644 --- a/elymas/lib/net/tcp.ey +++ b/elymas/lib/net/tcp.ey @@ -1,6 +1,9 @@ # Provide nice ways to do TCP/IP networking < + { ==err _ 0 lt { err ?? } rep } "+??" deffd + { ==err ==actions _ 0 lt { actions err ??? } rep } "+???" deffd + bin .scan "->" via bin .print "<-" via bin .produce "<=" via @@ -22,8 +25,8 @@ net .dns .resolveIpv4 -01 txt .consume .u sockaddrIpv4 - +AFINET +SOCKSTREAM +IPPROTOTCP +socket _ ==s # TODO: error handling - -01 +connect -- # TODO: error handling + +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s + -01 +connect +??io.net.connect -- s } /connectFd deffd @@ -37,9 +40,9 @@ # 0 <- listening socket fd { # ==port 0 <=un32 -01 sockaddrIpv4 - +AFINET +SOCKSTREAM +IPPROTOTCP +socket _ ==s # TODO: error handling - -01 +bind -- # TODO: error handling - s 256 +listen -- # TODO: error handling + +AFINET +SOCKSTREAM +IPPROTOTCP +socket +??io.net.socket _ ==s + -01 +bind +??io.net.bind -- + s 256 +listen +??io.net.listen -- s } _ /listenFd deffd /listen deffd @@ -47,7 +50,7 @@ # 0 -> listening socket fd # 0 <- newly accepted connection fd { # ==fd - +accept # TODO: error handling + +accept +??io.net.accept } /acceptFd deffd # 0 -> listening socket fd diff --git a/elymas/loaded.ey b/elymas/loaded.ey index f3538c5..01b91bc 100644 --- a/elymas/loaded.ey +++ b/elymas/loaded.ey @@ -1,6 +1,7 @@ #!/usr/bin/env elymas [ + "lib/err.ey" "lib/bin.ey" "lib/sys/linux.ey" "lib/net.ey" diff --git a/elymas/shared.ey b/elymas/shared.ey index 06b4e9d..bb7c940 100644 --- a/elymas/shared.ey +++ b/elymas/shared.ey @@ -1,6 +1,7 @@ #!/usr/bin/env elymas [ + "lib/err.ey" "lib/bin.ey" "lib/sys/linux.ey" "lib/sys/so.ey" |
