NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #16 most downloaded on Packagist
Guzzle is a PHP HTTP client library
Last release 21 days ago
06 Sep 2026
Ships unpredictably
gaps range from 8 days to 9 months
Nearly every release is documented
notes for 56 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
15 years old
185 releases · first in 2011
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
One column per quarter.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
idn_to_ascii() fix for old PHP versions #2489
Better defaults for PHP installations with old ICU lib #2454
Deprecated ClientInterface::VERSION
curl_multi_init. #2287null to the header option. #2132RetryMiddleware did not do exponential delay between retires due unit mismatch. #2132ClientInterface::VERSIONNo guzzle.phar was created in 6.4.0 due expired API token. This release will fix that
guzzle.phar was created in 6.4.0 due expired API token. This release will fix thatparent::__construct() to FileCookieJar and SessionCookieJarImprovement: Improved error messages when using curl < 7.21.2 #2108
RequestException::getResponseBodySummary() #2081GuzzleHttp\Exception\InvalidArgumentException #2163GuzzleHttp\_current_time() to use hrtime() if that function exists. #2242appconnect_time in TransferStats #2284CookieJar #2335MockHandler so we can test transfer time #2362Fix: Default headers when decode_content is specified
* Fix: Release process
Bug fix: Parsing 0 epoch expiry times in cookies #2014
Deprecation: BadResponseException instantiation without a response #1642
on_headers option in MockHandler #1580read_timeout option #1611CURLOPT_CAPATH and CURLOPT_CAINFO properly #1684\GuzzleHttp\Promise\rejection_for function instead of object init #1827Fix deprecations with guzzle/psr7 version 1.4
Allow to pass nullable Response to delay callable
Address HTTP_PROXY security vulnerability, CVE-2016-5385: https://httpoxy.org/
Content-Length in PHP StreamHandler to avoid timeouts when
a server does not honor Connection: close.Feature: added GuzzleHttp\json_encode and GuzzleHttp\json_decode. https://github.com/guzzle/guzzle/pull/1389
GuzzleHttp\json_encode and GuzzleHttp\json_decode.
https://github.com/guzzle/guzzle/pull/1389http_build_query for HHVM workaround.
https://github.com/guzzle/guzzle/pull/1367Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f
sink.
https://github.com/guzzle/guzzle/pull/1292Feature: Added the on_stats request option to provide access to transfer statistics for requests. https://github.com/guzzle/guzzle/pull/1202
on_stats request option to provide access to transfer
statistics for requests. https://github.com/guzzle/guzzle/pull/1202= inside of quotes in Cookies.
https://github.com/guzzle/guzzle/pull/1232body_as_string setting
https://github.com/guzzle/guzzle/pull/1201form_params and query now always uses the & separator.
https://github.com/guzzle/guzzle/pull/1163Fixed a memory leak in the curl handlers in which references to callbacks were not being removed by curl_reset.
curl_reset.Content-Encoding header may be removed an the
Content-Length modified to reflect the message size after removing the
encoding.form_params and
multipart in the same request.Fixed a bug with serializing the query request option where the & separator was missing.
query request option where the &
separator was missing.body is provided as an array. Please
use form_params or multipart instead.See the UPGRADING.md document for more information.
multipart and form_params request options.synchronous request option.on_headers request option.expect handling.default to true. This is no longer
required now that the cURL loop is not ticked for async requests.sink is valid if saving to a file.GuzzleHttp\RequestOptions to allow request options to be applied
using constants.$maxHandles has been removed from CurlMultiHandler.MultipartPostBody is now part of the guzzlehttp/psr7 package.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Marked GuzzleHttp\Client::getDefaultUserAgent as deprecated.
save_toAbstractRequestEvent::getTransaction() as public.Utils::getDefaultHandler()GuzzleHttp\Client::getDefaultUserAgent as deprecated.Added AppliesHeadersInterface to make applying headers to a request based on the body more generic and not specific to PostBodyInterface.
AppliesHeadersInterface to make applying headers to a request based
on the body more generic and not specific to PostBodyInterface.Pool class no longer uses recursion when a request is intercepted.
null when creating a request with a client will
ensure that the option is not set. This allows you to overwrite default
request options on a per-request basis.
See https://github.com/guzzle/guzzle/pull/937.protocols array in the allow_redirects request option."0" is now an allowed URI path. See
https://github.com/guzzle/guzzle/pull/935.Query no longer typehints on the $query argument in the constructor,
allowing for strings and arrays.end event are now correctly wrapped with Guzzle
specific exceptions if necessary.This change updates query strings so that they are treated as un-encoded values by default where the value represents an un-encoded value to send over
This change updates query strings so that they are treated as un-encoded values by default where the value represents an un-encoded value to send over the wire. A Query object then encodes the value before sending over the wire. This means that even value query string values (e.g., ":") are url encoded. This makes the Query class match PHP's http_build_query function. However, if you want to send requests over the wire using valid query string characters that do not need to be encoded, then you can provide a string to Url::setQuery() and pass true as the second argument to specify that the query string is a raw string that should not be parsed or encoded (unless a call to getQuery() is subsequently made, forcing the query-string to be converted into a Query object).
Added a trailing \r\n to multipart/form-data payloads. See https://github.com/guzzle/guzzle/pull/871
Added a trailing \r\n to multipart/form-data payloads. See
https://github.com/guzzle/guzzle/pull/871
Added a GuzzleHttp\Pool::send() convenience method to match the docs.
Status codes are now returned as integers. See https://github.com/guzzle/guzzle/issues/881
No longer overwriting an existing application/x-www-form-urlencoded header
when sending POST requests, allowing for customized headers. See
https://github.com/guzzle/guzzle/issues/877
Improved path URL serialization.
rawString argument is provided when setting the query
string on a URL: Now allowing many more characters to be present in the
query string without being percent encoded. See
https://datatracker.ietf.org/doc/html/rfc3986#appendix-AFixed an issue where connection errors still returned response object in error and end events event though the response is unusable. This has been cor
Bugfix release.
getResponse method of
these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867The breaking changes in this release are relatively minor. The biggest thing to look out for is that request and response objects no longer implement…
Adding support for non-blocking responses and some minor API cleanup.
guzzlehttp/guzzle-ring.GuzzleHttp\Pool which implements FutureInterface and transfers
requests concurrently using a capped pool size as efficiently as possible.hasListeners() to EmitterInterface.GuzzleHttp\ClientInterface::sendAll and marked
GuzzleHttp\Client::sendAll as deprecated (it's still there, just not the
recommended way).The breaking changes in this release are relatively minor. The biggest thing to look out for is that request and response objects no longer implement fluent interfaces.
return $this) from requests,
responses, GuzzleHttp\Collection, GuzzleHttp\Url,
GuzzleHttp\Query, GuzzleHttp\Post\PostBody, and
GuzzleHttp\Cookie\SetCookie. This blog post provides a good outline of
why I did this: https://ocramius.github.io/blog/fluent-interfaces-are-evil/.
This also makes the Guzzle message interfaces compatible with the current
PSR-7 message proposal.GuzzleHttp\Utils using camelCase. GuzzleHttp\json_decode
moved to GuzzleHttp\Utils::jsonDecode. GuzzleHttp\get_path moved to
GuzzleHttp\Utils::getPath. GuzzleHttp\set_path moved to
GuzzleHttp\Utils::setPath. GuzzleHttp\batch should now be
GuzzleHttp\Pool::batch, which returns an objectStorage. Using functions.php
caused problems for many users: they aren't PSR-4 compliant, require an
explicit include, and needed an if-guard to ensure that the functions are not
declared multiple times.GuzzleHttp\Adapter, these are now
implemented as callables that are stored in GuzzleHttp\Ring\Client.GuzzleHttp\Adapter\Transaction to GuzzleHttp\Transaction. The
Transaction object now exposes the request, response, and client as public
properties. The getters and setters have been removed.asArray parameter from
GuzzleHttp\Message\MessageInterface::getHeader. If you want to get a header
value as an array, then use the newly added getHeaderAsArray() method of
MessageInterface. This change makes the Guzzle interfaces compatible with
the PSR-7 interfaces.GuzzleHttp\Message\MessageFactory no longer allows subclasses to add
custom request options using double-dispatch (this was an implementation
detail). Instead, you should now provide an associative array to the
constructor which is a mapping of the request option name mapping to a
function that applies the option value to a request.GuzzleHttp\Stream\StreamInterface::getContents() no longer accepts a
maxLen parameter. This update makes the Guzzle streams project
compatible with the current PSR-7 proposal.GuzzleHttp\Stream\Stream::__construct,
GuzzleHttp\Stream\Stream::factory, and
GuzzleHttp\Stream\Utils::create no longer accept a size in the second
argument. They now accept an associative array of options, including the
"size" key and "metadata" key which can be used to provide custom metadata.Nothing published for this version
Nothing published for this version
Fixed a memory leak in the CurlAdapter when reusing cURL handles.
request_fulluri in stream adapter proxies.Ensuring that the StreamAdapter does not always add a Content-Type header
No longer utilizing the now deprecated namespaced methods from the stream package.
Content-Encoding response bodies
using the decode_content request option. This is set to true by default
to decode the response body if it comes over the wire with a
Content-Encoding. Set this value to false to disable decoding the
response content, and pass a string to provide a request Accept-Encoding
header and turn on automatic response decoding. This feature now allows you
to pass an Accept-Encoding header in the headers of a request but still
disable automatic response decoding.
Closes https://github.com/guzzle/guzzle/issues/764Fixed an issue in the CurlFactory that caused setting the stream=false request option to throw an exception. See: https://github.com/guzzle/guzzle/iss
stream=false
request option to throw an exception.
See: https://github.com/guzzle/guzzle/issues/769Content-Type header to multipart/form-data
when creating POST requests to force multipart bodies.
See https://github.com/guzzle/guzzle/issues/768Fixed an error in the HistoryPlugin that caused the same request and response to be logged multiple times when an HTTP protocol error occurs.
Added helper methods to make it easier to represent messages as strings, including getting the start line and getting headers as a string.
Automatically retrying cURL "Connection died, retrying a fresh connect" errors when possible.
Fixed a bug that caused multi-part POST requests with more than one field to serialize incorrectly.
ResponseInterface::xml now accepts a libxml_options option and added a
missing default argument that was required when parsing XML response bodies.save_to stream is now created lazily, which means that files are not
created on disk unless a request succeeds.Various fixes to multipart/form-data POST uploads
Added support for sending payloads with GET requests
Fixed an issue related to using custom message factory options in subclasses
json request option for POST requestsToArrayInterface to GuzzleHttp\Cookie\CookieJarAdded a json request option to easily serialize JSON payloads.
json request option to easily serialize JSON payloads.GuzzleHttp\json_decode() wrapper to safely parse JSON.setPort() and getPort() to GuzzleHttp\Message\RequestInterface.Nothing published for this version
The HTTP status code of a response is now set as the exception code of RequestException objects.
For information on changes and upgrading, see: https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40
GuzzleHttp\batch() as a convenience function for sending requests in
parallel without needing to write asynchronous code.GuzzleHttp\ClientInterface::sendAll().
You can now pass a callable or an array of associative arrays where each
associative array contains the "fn", "priority", and "once" keys.Nothing published for this version
See https://github.com/guzzle/guzzle/blob/4.x/UPGRADING.md#3x-to-40
Bug: Always using GET requests when redirecting from a 303 response
$certificateAuthority to false in
Guzzle\Http\ClientInterface::setSslVerification()"0"HTTP/1.0$ref attribute in service descriptions to merge over any existing parameters of a schema (rather than
clobbering everything).=.
For example foo&bar=baz is now correctly parsed and recognized as foo&bar=baz rather than foo=&bar=baz.Added the ability to define a POST name for a file
CURLOPT_TIMEOUT_MSsetRegex() method to match the docsdebug request parameter now checks if it is truthy rather than if it existsdebug request parameter to true shows verbose cURL output instead of using the LogPluginBug fix: 0 is now an allowed value in a description parameter that has a default value
Your coding agent can read these notes before it upgrades. Set up the MCP server →