RESTClient v2.0.0 Release NotesRelease Date: 2016-07-02 // over 3 years ago
🚀 This release is largely API compatible, but makes several breaking changes.
- ⬇️ Drop support for Ruby 1.9
- 👍 Allow mime-types as new as 3.x (requires ruby 2.0)
- Respect Content-Type charset header provided by server. Previously,
rest-client would not override the string encoding chosen by Net::HTTP. Now
responses that specify a charset will yield a body string in that encoding.
Content-Type: text/plain; charset=EUC-JPwill return a String encoded with
- 🔄 Change exceptions raised on request timeout. Instead of
RestClient::RequestTimeout(which is still used for HTTP 408), network timeouts will now raise either
RestClient::Exceptions::OpenTimeout, both of which inherit from
RestClient::Exceptions::Timeout. For backwards compatibility, this still inherits from
RestClient::RequestTimeoutso existing uses will still work. This may change in a future major release. These new timeout classes also make the original wrapped exception available as
- Unify request exceptions under
RestClient::RequestFailed, which still inherits from
ExceptionWithResponse. Previously, HTTP 304, 401, and 404 inherited directly from
ExceptionWithResponserather than from
RequestFailed. Now all HTTP status code exceptions inherit from both.
- ⏱ Rename the
:timeoutrequest option to
:timeoutis passed, now set both
- Change default HTTP Accept header to
- 0️⃣ Use a more descriptive User-Agent header by default
- ⬇️ Drop RC4-MD5 from default cipher list
- Only prepend http:// to URIs without a scheme
- 🛠 Fix some support for using IPv6 addresses in URLs (still affected by Ruby 2.0+ bug https://bugs.ruby-lang.org/issues/9129, with the fix expected to be backported to 2.0 and 2.1)
Responseobjects are now a subclass of
Stringrather than a
Stringthat mixes in the response functionality. Most of the methods remain unchanged, but this makes it much easier to understand what is happening when you look at a RestClient response object. There are a few additional changes:
- Response objects now implement
.inspectto make this distinction clearer.
Response#to_iwill now behave like
String#to_iinstead of returning the HTTP response code, which was very surprising behavior.
#to_swill now return a true
Stringobject rather than self. Previously there was no easy way to get the true
Stringresponse instead of the Frankenstein response string object with AbstractResponse mixed in.
- Response objects no longer accept an extra request args hash, but instead access request args directly from the request object, which reduces confusion and duplication.
- Response objects now implement
- 🖐 Handle multiple HTTP response headers with the same name (except for Set-Cookie, which is special) by joining the values with a comma space, compliant with RFC 7230
- 👍 Rewrite cookie support to be much smarter and to use cookie jars consistently
for requests, responses, and redirection in order to resolve long-standing
complaints about the previously broken behavior: (#498)
:cookiesoption may now be a Hash of Strings, an Array of HTTP::Cookie objects, or a full HTTP::CookieJar.
Request#cookiesto be a wrapper around the cookie jar.
- Still support passing the
:cookiesoption in the headers hash, but now raise ArgumentError if that option is also passed to
- Warn if both
Cookieheader are supplied.
- Use the
Request#cookie_jaras the basis for
Response#cookie_jar, creating a copy of the jar and adding any newly received cookies.
- When following redirection, also use this same strategy so that cookies from the original request are carried through in a standards-compliant way by the cookie jar.
- Don't set basic auth header if explicit
Authorizationheader is specified
- ➕ Add
:proxyoption to requests, which can be used for thread-safe per-request proxy configuration, overriding
- 👍 Allow overriding
ENV['http_proxy']to disable proxies by setting
RestClient.proxyto a falsey value. Previously there was no way in Ruby 2.x to turn off a proxy specified in the environment without changing
- ➕ Add actual support for streaming request payloads. Previously rest-client
.to_seven on RestClient::Payload::Streamed objects. Instead, treat any object that responds to
.readas a streaming payload and pass it through to
.body_stream=on the Net:HTTP object. This massively reduces the memory required for large file uploads.
- 🔄 Changes to redirection behavior: (#381, #484)
RestClient::MaxRedirectsReachedin favor of the normal
ExceptionWithResponsesubclasses. This makes the response accessible on the exception object as
.response, making it possible for callers to tell what has actually happened when the redirect limit is reached.
- When following HTTP redirection, store a list of each previous response on
the response object as
.history. This makes it possible to access the original response headers and body before the redirection was followed.
- Follow redirection consistently, regardless of whether the HTTP method was passed as a symbol or string. Under the hood rest-client now normalizes the HTTP request method to a lowercase string.
RestClient::Request. This makes it possible to add procs like
RestClient.add_before_execution_procto a single request without global state.
- ✅ Run tests on Travis's beta OS X support.
- 👉 Make
Request#transmita private method, along with a few others.
- ♻️ Refactor URI parsing to happen earlier, in Request initialization.
- 👌 Improve consistency and functionality of complex URL parameter handling:
- When adding URL params, handle URLs that already contain params.
- Add new convention for handling URL params containing deeply nested arrays and hashes, unify handling of null/empty values, and use the same code for GET and POST params. (#437)
- Add the RestClient::ParamsArray class, a simple array-like container that can be used to pass multiple keys with same name or keys where the ordering is significant.
- ➕ Add a few more exception classes for obscure HTTP status codes.
- Multipart: use a much more robust multipart boundary with greater entropy.
- 🛰 Make
RestClient::Payload::Base#inspectstop pretending to be a String.
Request#redacted_urlto display the URI with any password redacted.