aboutsummaryrefslogtreecommitdiff
path: root/elymas/lib/net/alg/http.ey
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