Skip to content

reliability: public pinned clients must not self-deny HTTPX default Connection header #194

Description

@seonghobae

Buyer-visible reliability defect

Protected main remains 7faf7a3b8a47980113982914000e724ab6a6cda5. The defect is reproduced and the bounded source repair is implemented on Draft PR #195, but it is not protected-main truth yet.

HTTPX adds an ambient Connection client default. EgressWeave correctly rejects hop-by-hop request metadata at its transport boundary, so before the repair an ordinary policy-allowed request built through the public EgressWeave client could deny itself before reaching the validated pinned pool unless the caller manually removed that framework default.

The root-cause remedy belongs at EgressWeave client construction, not in the transport validator: remove only HTTPX's ambient Connection default while continuing to fail closed on caller-supplied hop-by-hop fields.

Exact current implementation lane

Fresh identity:

  • protected/live base: 7faf7a3b8a47980113982914000e724ab6a6cda5;
  • canonical PR: fix(reliability): remove ambient HTTPX Connection default #195, fix(reliability): remove ambient HTTPX Connection default;
  • exact current PR head: 5abc442bb4269c2bdce74cd870bfc9889c70be89;
  • state: open / Draft / mergeable;
  • ancestry: 6 commits ahead / 0 behind exact protected main;
  • scope: src/egressweave/sync_transport.py, src/egressweave/transport.py, and tests/test_public_client_default_headers.py.

The current tree removes only the ambient HTTPX Connection default during synchronous/asynchronous public client construction. Caller-supplied hop-by-hop fields remain rejected by the existing fail-closed request-header validator. Destination authorization, normalized (hostname, port), methods, target/framing controls, redirects, proxies, Unix sockets, TLS identity, DNS pinning/revalidation, explicit credentials, finite resource budgets and cleanup are unchanged.

This PR remains the required predecessor for #193 / #134 response-cookie-state work.

Exact-current-head evidence

On unchanged 5abc442bb4269c2bdce74cd870bfc9889c70be89:

  • repository CI 31596370532: success;
  • SAST Semgrep 31596370551: success;
  • Security Scan 31596370786: aggregate success, but dependency-review job 94112774879 skipped the actual immutable-pinned Dependency review action; wrapper green is therefore non-passing supply-chain evidence;
  • OpenCode check 94121293201: success as check/model evidence only;
  • Noema check 94112774229: success as separate machine/model evidence;
  • Strix exact-head check 94112774246: wrapper success with Strix backend unavailable and no vulnerability report; this is non-passing semantic security evidence;
  • formal reviews: none;
  • unresolved review threads: none.

No wrapper, skipped action, backend-unavailable result, status/model evidence, predecessor head or synthetic merge revision is promoted into acceptance.

Acceptance criteria

  • Add focused sync and async public-builder RED tests proving an ordinary allowed request must reach an injected pinned pool without caller deletion of framework defaults.
  • Prove the final low-level request omits the ambient Connection hop-by-hop default.
  • Preserve fail-closed rejection of caller-supplied hop-by-hop headers; do not weaken _build_safe_request_headers.
  • Remove only the conflicting ambient client default without widening destinations, methods, redirects, proxies, Unix sockets, TLS identity, DNS pinning, framing, credentials or resource limits.
  • Keep synchronous and asynchronous public-builder behavior aligned.
  • Obtain exact-head repository CI and SAST success on the current repair.
  • Integrate the separately governed organization Dependency Review fail-closed repair and obtain fresh unchanged-head Security Scan evidence where the actual immutable-pinned Dependency review action executes and succeeds.
  • Obtain an actual exact-head Strix semantic report rather than backend-unavailable/no-report/wrapper-only evidence.
  • Revalidate every current human/automated finding, live base, ancestry, ruleset, required workflows and review threads immediately before integration.
  • Merge only the unchanged accepted tree under live governance and verify the ordinary public-client request path from protected main.
  • Only after fix(reliability): remove ambient HTTPX Connection default #195 reaches protected main, retarget/reconstruct test(security): reproduce response-driven cookie persistence #193 on the resulting exact protected base, reproduce security: prevent response-driven cookie persistence across egress requests #134 at the intended response-cookie boundary, and regenerate every base-sensitive evidence channel.

RCA discipline / non-goals

Do not solve this by allowing Connection: keep-alive through the security transport, by churning the clean #195 head to retrigger external providers, or by adding an EgressWeave-local substitute for organization-owned Dependency Review or Strix. The strict transport-side hop-by-hop rejection remains the correct protocol/security boundary.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions