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)