Avg Release Cycle
219 days ago
- 🐛 Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times
- 🐛 Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove itself from the EventDispatcher)
Guzzle\Log\MessageFormatternow properly writes "total_time" and "connect_time" values
- 🐛 Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too
- 🐛 Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a non-existent key
- 🐛 Bug: All __call() method arguments are now required (helps with mocking frameworks)
- 🚚 Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference to help with refcount based garbage collection of resources created by sending a request
- 🚚 Deprecating ZF1 cache and log adapters. These will be removed in the next major version.
- 🗄 Deprecating
Response::getPreviousResponse()(method signature still exists, but it's deprecated). Use the HistoryPlugin for a history.
- ➕ Added a
responseBodyalias for the
- ♻️ Refactored internals to no longer rely on Response::getRequest()
- 🔌 HistoryPlugin can now be cast to a string
- 🔊 HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests and responses that are sent over the wire
- ➕ Added
getRedirectCount()to Response objects
- 🐛 Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response
- ➕ Added a check to re-extract the temp cacert bundle from the phar before sending each request
- 🐛 Bug fix: Stream objects now work correctly with "a" and "a+" modes
- 🐛 Bug fix: Removing
Transfer-Encoding: chunkedheader when a Content-Length is present
- 🐛 Bug fix: AsyncPlugin no longer forces HEAD requests
- 🐛 Bug fix: DateTime timezones are now properly handled when using the service description schema formatter
- 🐛 Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails
- Setting a response on a request will write to the custom request body from the response body if one is specified
- 🔌 LogPlugin now writes to php://output when STDERR is undefined
- ➕ Added the ability to set multiple POST files for the same key in a single call
- 0️⃣ application/x-www-form-urlencoded POSTs now use the utf-8 charset by default
- ➕ Added the ability to queue CurlExceptions to the MockPlugin
- Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send)
- 🔧 Configuration loading now allows remote files
- ♻️ Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost.
- Exceptions are now properly grouped when sending requests in parallel
- Redirects are now properly aggregated when a multi transaction fails
- Redirects now set the response on the original object even in the event of a failure
- 🐛 Bug fix: Model names are now properly set even when using $refs
- ➕ Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax
- ➕ Added support for oauth_callback in OAuth signatures
- ➕ Added support for oauth_verifier in OAuth signatures
- ➕ Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection
- 🐛 Bug fix: URLs are now resolved correctly based on https://tools.ietf.org/html/rfc3986#section-5.2. #289
- 🐛 Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289
- 🐛 Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263
- 🐛 Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264.
- 🐛 Bug fix: Added
numbertype to service descriptions.
- 🐛 Bug fix: empty parameters are removed from an OAuth signature
- 🐛 Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header
- 🐛 Bug fix: Fixed "array to string" error when validating a union of types in a service description
- 🐛 Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream
- 🐛 Bug fix: Not including an
oauth_tokenif the value is null in the OauthPlugin.
- 🐛 Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs.
- 0️⃣ The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections.
- ➕ Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if the Content-Type can be determined based on the entity body or the path of the request.
- ➕ Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder.
- ➕ Added support for a PSR-3 LogAdapter.
- ➕ Added a
- ➕ Added
oauth_callbackparameter to the OauthPlugin
- ➕ Added the ability to create a custom stream class when using a stream factory
- ➕ Added a CachingEntityBody decorator
- ➕ Added support for
additionalParametersin service descriptions to define how custom parameters are serialized.
- The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar.
- You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies
- POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use POST fields or files (the latter is only used when emulating a form POST in the browser).
- Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest
- ➕ Added the ability to create PHP streaming responses from HTTP requests
- 🐛 Bug fix: Running any filters when parsing response headers with service descriptions
- 🐛 Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing
- 🐛 Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across response location visitors.
- 🐛 Bug fix: Removed the possibility of creating configuration files with circular dependencies
- RequestFactory::create() now uses the key of a POST file when setting the POST file name
- ➕ Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set
- 🐎 A large number of performance optimizations have been made
- 🐛 Bug fix: Added 'wb' as a valid write mode for streams
- 🐛 Bug fix:
Guzzle\Http\Message\Response::json()now allows scalar values to be returned
- 🐛 Bug fix: Fixed bug in
Guzzle\Http\Message\Responsewhere wrapping quotes were stripped from
- 🚚 BC: Removed
- BC: Setting a service description on a client will no longer modify the client's command factories.
- BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io'
Guzzle\Stream\Stream::getSteamType()are no longer converted to lowercase
- Operation parameter objects are now lazy loaded internally
- ➕ Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses
- ➕ Added support for instantiating responseType=class responseClass classes. Classes must implement
- ➕ Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These additional properties also support locations and can be used to parse JSON responses where the outermost part of the JSON is an array
- ➕ Added support for nested renaming of JSON models (rename sentAs to name)
- 🔌 CachePlugin
- Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error
- Debug headers can now added to cached response in the CachePlugin
- CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients.
- 0️⃣ URLs with no path no longer contain a "/" by default
- Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url.
- 👀 BadResponseException no longer includes the full request and response message
- ➕ Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface
- ➕ Adding getResponseBody() to Guzzle\Http\Message\RequestInterface
- ⚡️ Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription
- Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list
- xmlEncoding can now be customized for the XML declaration of a XML service description operation
- Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value aggregation and no longer uses callbacks
- The URL encoding implementation of Guzzle\Http\QueryString can now be customized
- 🐛 Bug fix: Filters were not always invoked for array service description parameters
- 🐛 Bug fix: Redirects now use a target response body rather than a temporary response body
- 🐛 Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded
- 🐛 Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives
- ♻️ Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the response body. For example, the XmlVisitor now parses the XML response into an array in the before() method.
- 🛠 Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent
- CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444)
- 🛠 Fixed a bug where redirect responses were not chained correctly using getPreviousResponse()
- 0️⃣ Setting default headers on a client after setting the user-agent will not erase the user-agent setting
- ➕ Adding wildcard support to Guzzle\Common\Collection::getPath()
- ➕ Adding alias support to ServiceBuilder configs
- ➕ Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface