ADR-0007: Controlled cURL only; no proxies or PHP streams in v1 

Status

Historical proposal (original status: Proposed)

Date

2026-10-08

Original decision makers

Project architecture/security owners; approval still pending in the original proposal.

Requirements

HG-005, HG-020, HG-021, HG-022, HG-028, HG-042

Original supersession

None; a new decision for the proposed product.

Context 

PHP streams do not implement a cURL pin. With proxies, origin resolution can happen at the proxy; a locally checked IP then does not prove its target connection. Guzzle majors differ in permitted raw options.

Sources: [S05, S08, S12, S13, S17].

Decision 

Enforce requires a tested cURL/curl-multi adapter. stream=true, foreign handlers, raw cURL options and uncertified transport-sharing settings are denied. cURL constants and behavior are checked for actual availability. The functional minimum version for multi-address support alone is not an accepted security baseline.

Version 1 supports no proxies. Explicit and actually inherited proxy configuration is detected; neither sending through it nor silently bypassing it is permitted. After the check passes, the controlled adapter prevents accidental proxy inheritance. An incoming HTTP Proxy header is not trusted process configuration.

The shared library contains separate, tested Guzzle 7/8 option adapters. Options that redirect transport remain owned by the guard. CA bundles, mTLS and approved timeouts are not replaced through raw override options.

Rejected alternatives 

  • Allow every Guzzle handler: no uniform guarantee.
  • Allowlist a proxy as a private endpoint: checks only the proxy, not its origin access.
  • Automatic direct fallback: bypasses corporate routing.
  • Pass through arbitrary raw cURL flags: opens independent target/resolver paths.

Consequences 

The v1 scope is clear and verifiable, but excludes proxy installations. A support error is visible rather than silently unsafe. Development must test real version combinations, not only Composer resolution.

Evidence and acceptance in the original proposal 

T040, T041, T042, T043, T044, T058, T080, T084. Details and expected results are in Original verification specification. These tests were specified, not executed as part of the original documentation delivery.

Reasons to reconsider 

A proxy adapter requires its own ADR, a defined trust model and evidence for the actual origin path. PHP streams also require independently proven binding before approval.