def h2.loop

bend-kit-http@0.38.2.0 · http.bend:3315

import bend-kit-http@0.38.2.0/http.bend as Http
import Base
import bend-kit-wire@0.4.7.0/wire.bend as Wire
import bend-kit-http2@0.4.0.0/http2.bend as H2

3315def h2.loop(n: Nat, step: H2Step, +ms: U32, +used: U32) ->
3316    IO(Result<&1, &1, Err, Conn & Res>):
3317  match n:
3318    case 0n:
3319      match step:
3320        case H2Reply{s, reply}:
3321          h2.fail(s, ErrBad{})
3322        case H2Sent{client, events, sent}:
3323          match sent:
3324            case Fail{e}:
3325              IO.pure(Result<&1, &1, Err, Conn & Res>, Fail{e})
3326            case Done{s}:
3327              h2.fail(s, ErrBad{})
3328        case H2Events{s, client, result}:
3329          h2.fail(s, ErrBad{})
3330        case H2Received{client, answer}:
3331          (s, r) = answer
3332          h2.fail(s, ErrBad{})
3333    case 1n+p:
3334      match step:
3335        case H2Reply{s, reply}:
3336          match reply:
3337            case H2.Failed{error}:
3338              h2.fail(s, ErrBad{})
3339            case H2.Advanced{client, writes, events}:
3340              do IO<Result<&1, &1, Err, Conn & Res>>:
3341                sent : Result<&1, &1, Err, Socket> <- h2.send(writes, s)
3342                h2.loop(p, H2Sent{client, events, sent}, ms, used)
3343        case H2Sent{client, events, sent}:
3344          match sent:
3345            case Fail{e}:
3346              IO.pure(Result<&1, &1, Err, Conn & Res>, Fail{e})
3347            case Done{s}:
3348              h2.loop(p, H2Events{s, client,
3349                List.foldl(~&1, ~H2.ClientEvent,
3350                  ~Result<&1, &1, Err, Maybe<&1, Res>>, ~h2.event.fold,
3351                  events, Done{None{}})}, ms, used)
3352        case H2Events{s, client, result}:
3353          match result:
3354            case Fail{e}:
3355              h2.fail(s, e)
3356            case Done{Some{res}}:
3357              IO.pure(Result<&1, &1, Err, Conn & Res>,
3358                Done{(ConnH2{s, client}, res)})
3359            case Done{None{}}:
3360              do IO<Result<&1, &1, Err, Conn & Res>>:
3361                r : Socket & Result<&1, &1, U32 & String, U32 & Array<U32>> <-
3362                  Wire.tls.recv.words(s, 16384, ms)
3363                h2.loop(p, H2Received{client, r}, ms, used)
3364        case H2Received{client, answer}:
3365          match answer:
3366            case (s, Fail{(+code, why)}):
3367              h2.fail(s, err.or_late(code, ErrRead{code, why}))
3368            case (s, Done{(0, buf)}):
3369              h2.fail(s, ErrBad{})
3370            case (s, Done{(+len, buf)}):
3371              +total = (used + len : U32)
3372              h2.loop(p, h2.received.step(fetch.over(total), s, client, len, buf), ms, total)

Uses (30)

Used by (1)