def server.accept.loop
bend-kit-http@0.38.2.0 · http.bend:6440
import bend-kit-http@0.38.2.0/http.bend as Http
import Base
import bend-kit-http@0.38.2.0/admission.bend as Admission
import bend-kit-wire@0.4.7.0/wire.bend as Wire
6440def server.accept.loop(~C: Data, ~operation: C -> Limits -> Chan(Admission.Command) -> Socket -> IO(Unit),
6441 step: AcceptStep<C>) -> IO(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>):
6442 match step:
6443 case AcceptChecking{server}:
6444 Server{listener, context, config, +inbox, drained} = server
6445 do IO<Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>>:
6446 running : Bool <- Admission.running(inbox)
6447 server.accept.loop(~C, ~operation, AcceptAllowed{running, Server{listener, context, config, inbox, drained}})
6448 case AcceptAllowed{running, server}:
6449 match running:
6450 case False{}:
6451 IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Fail{(0, "server stopped")}))
6452 case True{}:
6453 Server{listener, context, config, inbox, drained} = server
6454 do IO<Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>>:
6455 result : Listener & Result<&1, &1, U32 & String, Socket> <- Wire.accept.deadline(listener, 50)
6456 accepted : Server<C> & Result<&1, &1, U32 & String, Chan(Unit)> <-
6457 server.accepted(~C, ~operation, context, config, inbox, drained, result)
6458 server.accept.loop(~C, ~operation, AcceptReceived{accepted})
6459 case AcceptReceived{accepted}:
6460 (server, result) = accepted
6461 match result:
6462 case Fail{(+code, message)}:
6463 server.accept.loop(~C, ~operation, AcceptFailed{err.late(code), server, (code, message)})
6464 case Done{finished}:
6465 IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Done{finished}))
6466 case AcceptFailed{retry, server, error}:
6467 match retry:
6468 case True{}: server.accept.loop(~C, ~operation, AcceptChecking{server})
6469 case False{}: IO.pure(Server<C> & Result<&1, &1, U32 & String, Chan(Unit)>, (server, Fail{error}))