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}))

Uses (21)

Used by (1)