aboutsummaryrefslogtreecommitdiff
path: root/elymas
diff options
context:
space:
mode:
authorDrahflow <drahflow@gmx.de>2014-03-02 00:24:20 +0100
committerDrahflow <drahflow@gmx.de>2014-03-02 00:24:20 +0100
commite9f4e9e2992870920dafe0abc7418d8ea7f42a29 (patch)
treec6915481fba8e84b386d5718ae8ea7e11d5218ac /elymas
parentb2150cc0d050522acae179a891c69bab01581061 (diff)
Now using the error library
Diffstat (limited to 'elymas')
-rw-r--r--elymas/lib/net/alg/http.ey16
-rw-r--r--elymas/lib/net/alg/server.ey261
-rw-r--r--elymas/lib/net/tcp.ey15
-rw-r--r--elymas/loaded.ey1
-rw-r--r--elymas/shared.ey1
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"