Skip to content

Proposal/http callout filter#644

Open
usize wants to merge 4 commits into
praxis-proxy:mainfrom
usize:proposal/http-callout-filter
Open

Proposal/http callout filter#644
usize wants to merge 4 commits into
praxis-proxy:mainfrom
usize:proposal/http-callout-filter

Conversation

@usize

@usize usize commented Jun 22, 2026

Copy link
Copy Markdown
Member

Adds a how section to the http call out filter proposal.

This proposal splits the work into two deliverables:

  1. A new crate supporting http callouts from any filter.
  2. A general purpose http call out filter, doubling as reference implementation.

#138 is called out as a target consumer of the new http call out library.

usize and others added 4 commits June 21, 2026 20:02
Add the design and implementation plan for the http_callout filter:

- Per-instance reqwest::Client with rustls-tls, connection and TLS
  isolation for multi-tenant safety (no shared pools across filter
  instances)
- RFC 9535 JSONPath extraction via serde_json_path with config-time
  validation
- Satellite crate at filter/http-callout/ behind an opt-in cargo
  feature flag, following the ext-proc pattern
- Circuit breaker reuse from existing state machine
- SSRF prevention via static config-declared targets
- Fail-open/closed semantics, phase selection, body forwarding
- 4-PR implementation sequence
- Documents relationship to praxis-proxy#138 (ai_guardrails) with two
  integration paths

Assisted by Opus 4.6
These are out of scope for prior art.

Signed-off-by: Morgan Foster <39788015+usize@users.noreply.github.com>
Added details about the HTTP call-out filter implementation and requirements.

Signed-off-by: Morgan Foster <39788015+usize@users.noreply.github.com>
Updated the HTTP callout filter documentation by removing outdated sections and renumbering subsequent items.

Signed-off-by: Morgan Foster <39788015+usize@users.noreply.github.com>
@usize usize requested a review from a team June 22, 2026 04:02
@usize usize requested review from shaneutt and twghu as code owners June 22, 2026 04:02
@praxis-bot-app

Copy link
Copy Markdown

Missing Signed-off-by: c8c991f. All commits require sign-off (via git commit --signoff).

@praxis-bot praxis-bot left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review

Summary: Adds the How? section to the HTTP callout filter proposal with requirements, crate layout, filter struct, request flow, configuration schema, implementation plan, and ext_authz lessons-learned addendum.

Overall: Well-structured proposal that aligns with existing proposal conventions and makes technically accurate claims about the codebase. The design is thorough and the implementation plan is reasonable. A few items need attention.

Severity Count
Medium 3

Non-inline findings

None. All findings are inline.

@@ -197,9 +197,341 @@ filter_chains:
in `praxis-proto`.
- **NGINX auth_request** — sub-request to an authorization
endpoint; response status controls access.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Medium] The Lakera Guard and NVIDIA NeMo Guardrails entries were removed from Prior Art, but Lakera Guard is still the primary example throughout the proposal (motivation, example config, integration test plan). Either restore these entries or add a brief note explaining why they were removed. Removing prior art while retaining them as the central example is inconsistent.

├─ depth check ──► >= max_depth? ──► apply failure_mode
├─ circuit breaker check ──► Open? ──► apply failure_mode

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Medium] The request flow diagram only shows the on_request_body(end_of_stream=true) entry point, but lines 355-360 describe an alternative phase: request_headers mode that runs in on_request with an empty body. Add a second entry branch to the flow diagram (or a note at the top) showing the on_request path, so the diagram covers both execution modes.

#### SSRF prevention

Validation in `from_config()`:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Medium] body_from: request_body appears to be the only possible value for this field (the design section does not mention any alternatives). If there is only one option, this config field is redundant with phase: request_body and should be removed to avoid implying other sources exist. If other values are planned (e.g. body_from: none, body_from: custom_json), list them or add a comment indicating this is extensible.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants