blob: 6f7fe5617b22439a0a6fd569c3c37993362f5efb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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
|