def proxy.connect.loop
bend-kit-http@0.38.2.0 · http.bend:3429
import bend-kit-http@0.38.2.0/http.bend as Http
import Base
3429def proxy.connect.loop(n: Nat, step: TunnelStep, +ms: U32, +sni: String,
3430 +cert: Maybe<&2, Cert>, +ca: String) -> IO(Result<&1, &1, Err, Conn>):
3431 match n:
3432 case 0n:
3433 match step:
3434 case TunnelRead{s, raw}:
3435 proxy.connect.fail(s, ErrBad{})
3436 case TunnelHead{s, raw, result}:
3437 proxy.connect.fail(s, ErrBad{})
3438 case TunnelGot{raw, answer}:
3439 (s, result) = answer
3440 proxy.connect.fail(s, ErrBad{})
3441 case 1n+p:
3442 match step:
3443 case TunnelRead{s, +raw}:
3444 proxy.connect.loop(p, TunnelHead{s, raw,
3445 proxy.connect.frame(raw, Nat.is_gt(String.length(raw), 65536n))},
3446 ms, sni, cert, ca)
3447 case TunnelHead{s, raw, result}:
3448 match result:
3449 case FrameBad{}:
3450 proxy.connect.fail(s, ErrBad{})
3451 case FrameMore{}:
3452 do IO<Result<&1, &1, Err, Conn>>:
3453 answer : Socket & Result<&1, &1, U32 & String, U32 & Array<U32>> <-
3454 io.recv.words(False{}, s, 4096, ms)
3455 proxy.connect.loop(p, TunnelGot{raw, answer}, ms, sni, cert, ca)
3456 case FrameDone{res}:
3457 proxy.connect.finish(res, raw, s, ms, sni, cert, ca)
3458 case TunnelGot{raw, answer}:
3459 match answer:
3460 case (s, Fail{(+code, why)}):
3461 proxy.connect.fail(s, err.or_late(code, ErrRead{code, why}))
3462 case (s, Done{(+len, buf)}):
3463 proxy.connect.loop(p,
3464 proxy.connect.chunk(U32.is_zero(len), s, raw, len, buf),
3465 ms, sni, cert, ca)