386257391872e7b73befc2bcc3634706acf4acf0ff791bc60161179434c9a813.tri (1574B)
1 !import base as B 2 !import conversions as C 3 !import native_math as N 4 !import io_v2 as IO 5 !import io_v2_http as Transport 6 !import http as HTTP 7 !export main 8 !export server 9 -- Sequential example, not the registry's bounded concurrent admission policy. 10 router "GET" path _ _ = IO.pure (HTTP.okResponse (B.append "Hello from " (B.append path "\n"))) 11 router _ _ _ _ = IO.pure (HTTP.errorResponse 405 "Method not allowed\n") 12 port ["ipv4" _ value] = value 13 port _ = 0 14 ready listener = do IO.require 15 address <- IO.localAddress listener 16 output <- IO.stdout 17 IO.require (IO.writeAll output (B.append (C.showNumber (port address)) [10])) IO.pure 18 connection client = IO.bind (Transport.recvHeaders client) (reply : case reply of 19 ((t t), (bytes, t)) = Transport.handle router client (HTTP.parseRequestLine bytes) 20 (t, (431, t)) = Transport.respond client "" (HTTP.errorResponse 431 "Request Header Fields Too Large\n") 21 _ = Transport.respond client "" (HTTP.badRequestResponse "Bad Request\n")) 22 once listener = IO.scope (owner : IO.require (IO.acceptTCP listener owner) connection) 23 serve 0 _ = IO.pure t 24 serve count listener = IO.bind (once listener) (_ : serve (N.predecessor count) listener) 25 forever listener = IO.bind (once listener) (_ : forever listener) 26 server address count = IO.io (IO.scope (owner : do IO.require 27 listener <- IO.listenTCP owner address 5 28 IO.bind (ready listener) (_ : serve count listener))) 29 main = IO.io (IO.scope (owner : do IO.require 30 listener <- IO.listenTCP owner (IO.ipv4 [127 0 0 1] 9050) 5 31 IO.bind (ready listener) (_ : forever listener)))