guzzlehttp/guzzle
Guzzle is a PHP HTTP client that makes sending HTTP requests simple and integrating with web services trivial. It supports sync and async requests, PSR-7 and PSR-18 interfaces, streaming uploads and downloads, middleware, and abstracts away the underlying transport.
guzzlehttp/psr7 is now constrained to ^3.2 and guzzlehttp/promises to ^3.1. Both are major-line positions relative to the PSR-7/PSR-18 v2 generation that Laravel and most of the ecosystem consume. Architectural fit with Laravel's HTTP stack is now gated by transitive constraints, not just the top-level Guzzle constraint.GuzzleHttp\Middleware::tap(), retry, and logging middleware remain the cross-cutting mechanism. However, the retry middleware's default decision logic keys on exception type, and 8.3.0 changes the classification of two cURL error codes (see Technical Risk) — so the middleware architecture is stable while its inputs shift.Content-Length (including 0), early termination raised as an error, gzip/deflate trailing data rejected, and raw deflate accepted. Architecturally this is a consistency win: the stream fallback now produces the same observable behaviour as the cURL transport, which reduces the class of environment-dependent bugs. It also means the stream transport is no longer a lenient escape hatch for malformed upstream responses.Promise\Is with Promise\State is routine hygiene, but it signals the package is tracking a PHP version not yet in the fleet's baseline. Confirm the internal-only nature of that API surface if any application code touches GuzzleHttp\Promise internals.max_host_connections / max_total_connections) combined with persistent transport sharing on libcurl 8.22.0+ remain the primary architectural feature of the 8.x line. Unchanged in 8.3.0.guzzlehttp/guzzle: ^7.2 and guzzlehttp/psr7: ^2.x. The 8.3.0 move to psr7 ^3.2 compounds the existing top-level conflict with a second, deeper one: even if the Guzzle constraint is widened by a framework release or an application override, the PSR-7 major line must also be resolvable. Verify both constraints per Laravel minor before any planning.Psr\Http\Message\* against the v2 line, or that pins guzzlehttp/psr7 ^2, becomes a resolution blocker. The blast radius of this release is wider than its changelog implies.^3.1: Verify nothing in the dependency graph pins guzzlehttp/promises ^2. Laravel's queue/pool helpers and any package doing async HTTP are candidates.GuzzleHttp\Client instances remains unaffected. Config option names should be re-verified against 8.x docs.sendAsync()/getAsync() behaviour is unchanged, though promise internals moved.UPGRADING.md review and dependency-tree audit is mandatory before any of this is actionable.guzzle ^7 and psr7 ^2). Likelihood of composer resolution failure is higher than in the prior assessment. Mitigation: check each Laravel minor; do not use --ignore-platform-reqs in production; stay on 7.x until the framework widens support.CURLE_WEIRD_SERVER_REPLY, CURLE_WRITE_ERROR) are now classified as ResponseTransferException with a response attached when a response is available. Any catch block, retry predicate, or Laravel Http::retry() callback that branches on ConnectException / RequestException may silently change behaviour — including retrying things it previously did not, or vice versa. Mitigation: inventory every exception-type check on HTTP calls; confirm ResponseTransferException's position in the hierarchy; add explicit tests.stream => true — large downloads, proxies, file relays, SSE-ish consumption — may surface exceptions against non-compliant upstreams that were previously tolerated. Mitigation: inventory stream => true usage; test against real upstreams, including any that send sloppy Content-Length or trailing gzip data.Content-Length, including 0. Handlers that assumed a stream would yield more, or that relied on lax termination, need verification.psr7 ^3.2 / promises ^3.1 bumps can force upgrades of unrelated packages, which is a second-order risk not visible in the Guzzle changelog.curl_version()['version'] >= 8.22.0 in deployment checks.max_total_connections under concurrent queue load causes head-of-line blocking. Load-test before enabling.guzzlehttp/guzzle: ^8.x, or does it still pin ^7.x?guzzlehttp/psr7 ^2 or guzzlehttp/promises ^2, which 8.3.0 would break?ConnectException/RequestException in a way that cURL errors 8 and 23 moving to ResponseTransferException would alter?stream => true, and do their upstreams send compliant chunked encoding, accurate Content-Length, and cleanly terminated gzip/deflate?UPGRADING.md been reviewed for breaking changes beyond the 8.2.0/8.3.0 notes?^7.14 cleanly if the major upgrade surfaces regressions?Http::withOptions() against 8.x option names.stream => true now gets libcurl-equivalent strictness. Treat these as migration candidates requiring per-upstream validation, not a drop-in change.guzzle ^8 question and the transitive psr7 ^3.2 / promises ^3.1 question. If either fails, defer or isolate (e.g., a standalone service) rather than forcing constraints.UPGRADING.md end-to-end, then the 8.2.0 and 8.3.0 notes; catalogue breaking changes affecting handlers, options, exceptions, and stream semantics.composer require guzzlehttp/guzzle:^8.3 --update-with-dependencies
ConnectException, RequestException, TransferException, and retry predicates; add tests pinning the new cURL-8/23 → ResponseTransferException behaviour.stream => true call sites; test each against real upstreams for chunked fidelity, Content-Length accuracy (including 0), and gzip/deflate termination.MockHandler; integration tests for proxy/auth, streaming, and truncated-response handling; load tests with connection caps enabled to validate no head-of-line blocking.^7.14.composer.json constraints for both guzzlehttp/guzzle and guzzlehttp/psr7. The 7.x/PSR-7-v2 pin is the common blocker. Facade-level compatibility does not imply dependency compatibility.psr7 ^3.2 and promises ^3.1 are the widened blast radius of this release; check interoperating packages (nyholm/psr7, symfony/http-client, bridges, SDKs) for compatible or conflicting pins.composer.lock and treat stream-handler changes as review-worthy in future minor releases, since they ship outside semver's "breaking" label but are observably breaking.Content-Length) becomes our incident under 8.3.0, where previously it was tolerated. Expect some support load shifting from "silent data corruption" to "new exception" — a net improvement but a visible change.ResponseTransferException can reroute retry logic, altering traffic volume and timeout behaviour under incident conditions.stream => true sites) that 8.2.0 did not require. The 8.2.0 pooling feature itself remains low-effort once the major upgrade is complete; the cost continues to be dominated by the 7.x → 8.x transition and, newly, by validating PSR-7 v3 coexistence with the Laravel stack.How can I help you explore Laravel packages today?