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)

Uses (26)

Used by (1)