[Http] Error responses are now never written to the intended response stream of a request, but rather to a temporary stream. This helps when retrying failed requests so that the intended stream is not polluted with transient errors.
[Http] Adding the ability to retry failed requests with the exponential backoff plugin by checking both the status code and reason phrase.
[Service] Simplifying the loop in Guzzle\Service\Command\DynamicCommand
[Http] Using a factory method when creating bad response exceptions. Adding ClientErrorResponseException and ServerErrorResponseException.
[Http] Removing curl specific protocal version code from RequestInterace and pushing it to the curl namespace
[Http] Renaming parseUrlUtf8 to parseUrl and fixing a typo
1. Adopting a marker interface for Guzzle exceptions.
A. All exceptions emitted from Guzzle are now wrapped with a Guzzle namespaced exception.
B. Guzzle\Common\GuzzleExceptionInterface was renamed to Guzzle\Common\GuzzleException
C. Guzzle\Common\ExceptionCollection was renamed to Guzzle\Common\Exception\ExceptionCollection
2. Using Header objects for Request and Response objects
A. When you call $request->getHeader('X'), you will get back a Guzzle\Http\Message\Header object that contains all of the headers that case insensitively match. This object can be cast to a string or iterated like an array. You can pass true in the second argument to retrieve the header as a string.
B. Removing the old Guzzle\Common\Collection based searching arguments from most of the request and response header methods. All retrievals are case-insensitive and return Header objects.
3. Changing the two headers added by the cache plugin to just one header with key and ttl.
4. Changing Guzzle\Http\Message\Response::factory() to fromMessage().
5. Removing the NullObject return value from ServiceDescriptions and instead simply returning null
New Features / enhancements:
1. Adding Guzzle\Http\Message\AbstractMessage::addHeaders()
2. Making it simpler to create service descriptions using a unified factory method that delegates to other factories.
3. Better handling of ports and hosts in Guzzle\Http\Url
Note: This is a noisy diff because I'm removing trailing whitespace and adding a new line at the end of each source file.
Adding normalized behavior to Guzzle\Http\Message\AbstractMessage::getHeader() so that it returns an array of headers if multiple header values are found for a specific header key. It will return a single string if only one header is found.
Updating curl handle to work with multiple headers per key
Removing command factories from Guzzle\Service\Description\ServiceDescription. Use Guzzle\Service\Command\Factory\ServiceDescriptionFactory instead.
Setting a service description on a client will update any attached service description factories.
Updating the cache interface to allow passing options to cache methods.
Removing the constructor and removing getCachedObject from CacheAdapterInterface.
Adding a ClosureCacheAdapter.
[Service] Adding the ability to use magic call method behavior for executing commands by name. Closes#39.
[Tests] Fixing a logging unit test so that it does not spit out to stdout
Separating test dependencies from Guzzle deps by adding a composer-test.json.
Adding unit testing capabilities to the Guzzle phar files.
Updating travis-ci script to use new composer file and adding code coverage to travis runs
[Build] Fixing guzzle-min.phar warning that tried to load index.php
Adding a test-init phing target to help getting setup for testing.
Fixing composer run in travis
Adding the ability to set HTTP request headers to NULL so that they are still passed to curl. This is useful for removing some default curl headers. Empty headers are still not sent to curl.
Not setting "Expect: 100-Continue" when sending with application/x-www-form-urlencoded POST requests
Adding PATCH method
Fixing docblock for PUT method
Updating request message parsing to allow for custom verbs
Adding a Content-Length: 0 header when sending an entity enclosing request with no body or post fields. Closes#34