diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9d841de09..17ec24c9e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -80,1784 +80,11 @@ _2019-06-03_
* First stable preview of OkHttp 4.
-## Version 3.14.2
+## Version 3.x
-_2019-05-19_
+[Change log](http://square.github.io/okhttp/changelog_3x/)
- * Fix: Lock in a route when recovering from an HTTP/2 connection error. We had a bug where two
- calls that failed at the same time could cause OkHttp to crash with a `NoSuchElementException`
- instead of the expected `IOException`.
- * Fix: Don't crash with a `NullPointerException` when formatting an error message describing a
- truncated response from an HTTPS proxy.
-
-
-## Version 3.12.3
-
-_2019-05-07_
-
- * Fix: Permit multipart file names to contain non-ASCII characters.
- * Fix: Retain the `Route` when a connection is reused on a redirect or other follow-up. This was
- causing some `Authenticator` calls to see a null route when non-null was expected.
-
-
-## Version 3.14.1
-
-_2019-04-10_
-
- * Fix: Don't crash when an interceptor retries when there are no more routes. This was an
- edge-case regression introduced with the events cleanup in 3.14.0.
-
- * Fix: Provide actionable advice when the exchange is non-null. Prior to 3.14, OkHttp would
- silently leak connections when an interceptor retries without closing the response body. With
- 3.14 we detect this problem but the exception was not helpful.
-
-## Version 3.14.0
-
-_2019-03-14_
-
- * **This release deletes the long-deprecated `OkUrlFactory` and `OkApacheClient` APIs.** These
- facades hide OkHttp's implementation behind another client's API. If you still need this please
- copy and paste [ObsoleteUrlFactory.java][obsolete_url_factory] or
- [ObsoleteApacheClient.java][obsolete_apache_client] into your project.
-
- * **OkHttp now supports duplex calls over HTTP/2.** With normal HTTP calls the request must finish
- before the response starts. With duplex, request and response bodies are transmitted
- simultaneously. This can be used to implement interactive conversations within a single HTTP
- call.
-
- Create duplex calls by overriding the new `RequestBody.isDuplex()` method to return true.
- This simple option dramatically changes the behavior of the request body and of the entire
- call.
-
- The `RequestBody.writeTo()` method may now retain a reference to the provided sink and
- hand it off to another thread to write to it after `writeTo` returns.
-
- The `EventListener` may now see requests and responses interleaved in ways not previously
- permitted. For example, a listener may receive `responseHeadersStart()` followed by
- `requestBodyEnd()`, both on the same call. Such events may be triggered by different threads
- even for a single call.
-
- Interceptors that rewrite or replace the request body may now inadvertently interfere with
- duplex request bodies. Such interceptors should check `RequestBody.isDuplex()` and avoid
- accessing the request body when it is.
-
- Duplex calls require HTTP/2. If HTTP/1 is established instead the duplex call will fail. The
- most common use of duplex calls is [gRPC][grpc_http2].
-
- * New: Prevent OkHttp from retransmitting a request body by overriding `RequestBody.isOneShot()`.
- This is most useful when writing the request body is destructive.
-
- * New: We've added `requestFailed()` and `responseFailed()` methods to `EventListener`. These
- are called instead of `requestBodyEnd()` and `responseBodyEnd()` in some failure situations.
- They may also be fired in cases where no event was published previously. In this release we did
- an internal rewrite of our event code to fix problems where events were lost or unbalanced.
-
- * Fix: Don't leak a connection when a call is canceled immediately preceding the `onFailure()`
- callback.
-
- * Fix: Apply call timeouts when connecting duplex calls, web sockets, and server-sent events.
- Once the streams are established no further timeout is enforced.
-
- * Fix: Retain the `Route` when a connection is reused on a redirect or other follow-up. This was
- causing some `Authenticator` calls to see a null route when non-null was expected.
-
- * Fix: Use the correct key size in the name of `TLS_AES_128_CCM_8_SHA256` which is a TLS 1.3
- cipher suite. We accidentally specified a key size of 256, preventing that cipher suite from
- being selected for any TLS handshakes. We didn't notice because this cipher suite isn't
- supported on Android, Java, or Conscrypt.
-
- We removed this cipher suite and `TLS_AES_128_CCM_SHA256` from the restricted, modern, and
- compatible sets of cipher suites. These two cipher suites aren't enabled by default in either
- Firefox or Chrome.
-
- See our [TLS Configuration History][tls_configuration_history] tracker for a log of all changes
- to OkHttp's default TLS options.
-
- * New: Upgrade to Conscrypt 2.0.0. OkHttp works with other versions of Conscrypt but this is the
- version we're testing against.
-
- ```kotlin
- implementation("org.conscrypt:conscrypt-openjdk-uber:2.0.0")
- ```
-
- * New: Update the embedded public suffixes list.
-
-
-## Version 3.12.2
-
-_2019-03-14_
-
- * Fix: Don't crash if the HTTPS server returns no certificates in the TLS handshake.
- * Fix: Don't leak a connection when a call is canceled immediately preceding the `onFailure()`
- callback.
-
-
-## Version 3.13.1
-
-_2019-02-05_
-
- * Fix: Don't crash when using a custom `X509TrustManager` or `SSLSocket` on Android. When we
- removed obsolete code for Android 4.4 we inadvertently also removed support for custom
- subclasses. We've restored that support!
-
-
-## Version 3.13.0
-
-_2019-02-04_
-
- * **This release bumps our minimum requirements to Java 8+ or Android 5+.** Cutting off old
- devices is a serious change and we don't do it lightly! [This post][require_android_5] explains
- why we're doing this and how to upgrade.
-
- The OkHttp 3.12.x branch will be our long-term branch for Android 2.3+ (API level 9+) and Java
- 7+. These platforms lack support for TLS 1.2 and should not be used. But because upgrading is
- difficult we will backport critical fixes to the 3.12.x branch through December 31, 2020.
-
- * **TLSv1 and TLSv1.1 are no longer enabled by default.** Major web browsers are working towards
- removing these versions altogether in early 2020. If your servers aren't ready yet you can
- configure OkHttp 3.13 to allow TLSv1 and TLSv1.1 connections:
-
- ```
- OkHttpClient client = new OkHttpClient.Builder()
- .connectionSpecs(Arrays.asList(ConnectionSpec.COMPATIBLE_TLS))
- .build();
- ```
-
- * New: You can now access HTTP trailers with `Response.trailers()`. This method may only be called
- after the entire HTTP response body has been read.
-
- * New: Upgrade to Okio 1.17.3. If you're on Kotlin-friendly Okio 2.x this release requires 2.2.2
- or newer.
-
- ```kotlin
- implementation("com.squareup.okio:okio:1.17.3")
- ```
-
- * Fix: Don't miss cancels when sending HTTP/2 request headers.
- * Fix: Don't miss whole operation timeouts when calls redirect.
- * Fix: Don't leak connections if web sockets have malformed responses or if `onOpen()` throws.
- * Fix: Don't retry when request bodies fail due to `FileNotFoundException`.
- * Fix: Don't crash when URLs have IPv4-mapped IPv6 addresses.
- * Fix: Don't crash when building `HandshakeCertificates` on Android API 28.
- * Fix: Permit multipart file names to contain non-ASCII characters.
- * New: API to get MockWebServer's dispatcher.
- * New: API to access headers as `java.time.Instant`.
- * New: Fail fast if a `SSLSocketFactory` is used as a `SocketFactory`.
- * New: Log the TLS handshake in `LoggingEventListener`.
-
-
-## Version 3.12.1
-
-_2018-12-23_
-
- * Fix: Remove overlapping `package-info.java`. This caused issues with some build tools.
-
-
-## Version 3.12.0
-
-_2018-11-16_
-
- * **OkHttp now supports TLS 1.3.** This requires either Conscrypt or Java 11+.
-
- * **Proxy authenticators are now asked for preemptive authentication.** OkHttp will now request
- authentication credentials before creating TLS tunnels through HTTP proxies (HTTP `CONNECT`).
- Authenticators should identify preemptive authentications by the presence of a challenge whose
- scheme is "OkHttp-Preemptive".
-
- * **OkHttp now offers full-operation timeouts.** This sets a limit on how long the entire call may
- take and covers resolving DNS, connecting, writing the request body, server processing, and
- reading the full response body. If a call requires redirects or retries all must complete within
- one timeout period.
-
- Use `OkHttpClient.Builder.callTimeout()` to specify the default duration and `Call.timeout()` to
- specify the timeout of an individual call.
-
- * New: Return values and fields are now non-null unless otherwise annotated.
- * New: `LoggingEventListener` makes it easy to get basic visibility into a call's performance.
- This class is in the `logging-interceptor` artifact.
- * New: `Headers.Builder.addUnsafeNonAscii()` allows non-ASCII values to be added without an
- immediate exception.
- * New: Headers can be redacted in `HttpLoggingInterceptor`.
- * New: `Headers.Builder` now accepts dates.
- * New: OkHttp now accepts `java.time.Duration` for timeouts on Java 8+ and Android 26+.
- * New: `Challenge` includes all authentication parameters.
- * New: Upgrade to BouncyCastle 1.60, Conscrypt 1.4.0, and Okio 1.15.0. We don't yet require
- Kotlin-friendly Okio 2.x but OkHttp works fine with that series.
-
- ```kotlin
- implementation("org.bouncycastle:bcprov-jdk15on:1.60")
- implementation("org.conscrypt:conscrypt-openjdk-uber:1.4.0")
- implementation("com.squareup.okio:okio:1.15.0")
- ```
-
- * Fix: Handle dispatcher executor shutdowns gracefully. When there aren't any threads to carry a
- call its callback now gets a `RejectedExecutionException`.
- * Fix: Don't permanently cache responses with `Cache-Control: immutable`. We misunderstood the
- original `immutable` proposal!
- * Fix: Change `Authenticator`'s `Route` parameter to be nullable. This was marked as non-null but
- could be called with null in some cases.
- * Fix: Don't create malformed URLs when `MockWebServer` is reached via an IPv6 address.
- * Fix: Don't crash if the system default authenticator is null.
- * Fix: Don't crash generating elliptic curve certificates on Android.
- * Fix: Don't crash doing platform detection on RoboVM.
- * Fix: Don't leak socket connections when web socket upgrades fail.
-
-
-## Version 3.11.0
-
-_2018-07-12_
-
- * **OkHttp's new okhttp-tls submodule tames HTTPS and TLS.**
-
- `HeldCertificate` is a TLS certificate and its private key. Generate a certificate with its
- builder then use it to sign another certificate or perform a TLS handshake. The
- `certificatePem()` method encodes the certificate in the familiar PEM format
- (`--- BEGIN CERTIFICATE ---`); the `privateKeyPkcs8Pem()` does likewise for the private key.
-
- `HandshakeCertificates` holds the TLS certificates required for a TLS handshake. On the server
- it keeps your `HeldCertificate` and its chain. On the client it keeps the root certificates
- that are trusted to sign a server's certificate chain. `HandshakeCertificates` also works with
- mutual TLS where these roles are reversed.
-
- These classes make it possible to enable HTTPS in MockWebServer in [just a few lines of
- code][https_server_sample].
-
- * **OkHttp now supports prior knowledge cleartext HTTP/2.** Enable this by setting
- `Protocol.H2_PRIOR_KNOWLEDGE` as the lone protocol on an `OkHttpClient.Builder`. This mode
- only supports `http:` URLs and is best suited in closed environments where HTTPS is
- inappropriate.
-
- * New: `HttpUrl.get(String)` is an alternative to `HttpUrl.parse(String)` that throws an exception
- when the URL is malformed instead of returning null. Use this to avoid checking for null in
- situations where the input is known to be well-formed. We've also added `MediaType.get(String)`
- which is an exception-throwing alternative to `MediaType.parse(String)`.
- * New: The `EventListener` API previewed in OkHttp 3.9 has graduated to a stable API. Use this
- interface to track metrics and monitor HTTP requests' size and duration.
- * New: `okhttp-dnsoverhttps` is an experimental API for doing DNS queries over HTTPS. Using HTTPS
- for DNS offers better security and potentially better performance. This feature is a preview:
- the API is subject to change.
- * New: `okhttp-sse` is an early preview of Server-Sent Events (SSE). This feature is incomplete
- and is only suitable for experimental use.
- * New: MockWebServer now supports client authentication (mutual TLS). Call `requestClientAuth()`
- to permit an optional client certificate or `requireClientAuth()` to require one.
- * New: `RecordedRequest.getHandshake()` returns the HTTPS handshake of a request sent to
- `MockWebServer`.
- * Fix: Honor the `MockResponse` header delay in MockWebServer.
- * Fix: Don't release HTTP/2 connections that have multiple canceled calls. We had a bug where
- canceling calls would cause the shared HTTP/2 connection to be unnecessarily released. This
- harmed connection reuse.
- * Fix: Ensure canceled and discarded HTTP/2 data is not permanently counted against the limited
- flow control window. We had a few bugs where window size accounting was broken when streams
- were canceled or reset.
- * Fix: Recover gracefully if the TLS session returns an unexpected version (`NONE`) or cipher
- suite (`SSL_NULL_WITH_NULL_NULL`).
- * Fix: Don't change Conscrypt configuration globally. We migrated from a process-wide setting to
- configuring only OkHttp's TLS sockets.
- * Fix: Prefer TLSv1.2 where it is available. On certain older platforms it is necessary to opt-in
- to TLSv1.2.
- * New: `Request.tag()` permits multiple tags. Use a `Class>` as a key to identify tags. Note
- that `tag()` now returns null if the request has no tag. Previously this would return the
- request itself.
- * New: `Headers.Builder.addAll(Headers)`.
- * New: `ResponseBody.create(MediaType, ByteString)`.
- * New: Embed R8/ProGuard rules in the jar. These will be applied automatically by R8.
- * Fix: Release the connection if `Authenticator` throws an exception.
- * Fix: Change the declaration of `OkHttpClient.cache()` to return a `@Nullable Cache`. The return
- value has always been nullable but it wasn't declared properly.
- * Fix: Reverse suppression of connect exceptions. When both a call and its retry fail, we now
- throw the initial exception which is most likely to be actionable.
- * Fix: Retain interrupted state when throwing `InterruptedIOException`. A single interrupt should
- now be sufficient to break out an in-flight OkHttp call.
- * Fix: Don't drop a call to `EventListener.callEnd()` when the response body is consumed inside an
- interceptor.
-
-
-## Version 3.10.0
-
-_2018-02-24_
-
- * **The pingInterval() feature now aggressively checks connectivity for web
- sockets and HTTP/2 connections.**
-
- Previously if you configured a ping interval that would cause OkHttp to send
- pings, but it did not track whether the reply pongs were received. With this
- update OkHttp requires that every ping receive a response: if it does not
- the connection will be closed and the listener's `onFailure()` method will
- be called.
-
- Web sockets have always been had pings, but pings on HTTP/2 connections is
- new in this release. Pings are used for connections that are busy carrying
- calls and for idle connections in the connection pool. (Pings do not impact
- when pooled connections are evicted).
-
- If you have a configured ping interval, you should confirm that it is long
- enough for a roundtrip from client to server. If your ping interval is too
- short, slow connections may be misinterpreted as failed connections. A ping
- interval of 30 seconds is reasonable for most use cases.
-
- * **OkHttp now supports [Conscrypt][conscrypt].** Conscrypt is a Java Security
- Provider that integrates BoringSSL into the Java platform. Conscrypt
- supports more cipher suites than the JVM’s default provider and may also
- execute more efficiently.
-
- To use it, first register a [Conscrypt dependency][conscrypt_dependency] in
- your build system.
-
- OkHttp will use Conscrypt if you set the `okhttp.platform` system property
- to `conscrypt`.
-
- Alternatively, OkHttp will also use Conscrypt if you install it as your
- preferred security provider. To do so, add the following code to execute
- before you create your `OkHttpClient`.
-
- ```
- Security.insertProviderAt(
- new org.conscrypt.OpenSSLProvider(), 1);
- ```
-
- Conscrypt is the bundled security provider on Android so it is not necessary
- to configure it on that platform.
-
- * New: `HttpUrl.addQueryParameter()` percent-escapes more characters.
- Previously several ASCII punctuation characters were not percent-escaped
- when used with this method. This does not impact already-encoded query
- parameters in APIs like `HttpUrl.parse()` and
- `HttpUrl.Builder.addEncodedQueryParameter()`.
- * New: CBC-mode ECDSA cipher suites have been removed from OkHttp's default
- configuration: `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` and
- `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA`. This tracks a [Chromium
- change][remove_cbc_ecdsa] to remove these cipher suites because they are
- fragile and rarely-used.
- * New: Don't fall back to common name (CN) verification for hostnames. This
- behavior was deprecated with RFC 2818 in May 2000 and was recently dropped
- from major web browsers.
- * New: Honor the `Retry-After` response header. HTTP 503 (Unavailable)
- responses are retried automatically if this header is present and its delay
- is 0 seconds. HTTP 408 (Client Timeout) responses are retried automatically
- if the header is absent or its delay is 0 seconds.
- * New: Allow request bodies for all HTTP methods except GET and HEAD.
- * New: Automatic module name of `okhttp3` for use with the Java Platform
- Module System.
- * New: Log gzipped bodies when `HttpLoggingInterceptor` is used as a network
- interceptor.
- * New: `Protocol.QUIC` constant. This protocol is not supported but this
- constant is included for completeness.
- * New: Upgrade to Okio 1.14.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.14.0
-
-
- com.squareup.okio:okio:1.14.0
- ```
-
- * Fix: Handle `HTTP/1.1 100 Continue` status lines, even on requests that did
- not send the `Expect: continue` request header.
- * Fix: Do not count web sockets toward the dispatcher's per-host connection
- limit.
- * Fix: Avoid using invalid HTTPS sessions. This prevents OkHttp from crashing
- with the error, `Unexpected TLS version: NONE`.
- * Fix: Don't corrupt the response cache when a 304 (Not Modified) response
- overrides the stored "Content-Encoding" header.
- * Fix: Gracefully shut down the HTTP/2 connection before it exhausts the
- namespace of stream IDs (~536 million streams).
- * Fix: Never pass a null `Route` to `Authenticator`. There was a bug where
- routes were omitted for eagerly-closed connections.
-
-## Version 3.9.1
-
-_2017-11-18_
-
- * New: Recover gracefully when Android's DNS crashes with an unexpected
- `NullPointerException`.
- * New: Recover gracefully when Android's socket connections crash with an
- unexpected `ClassCastException`.
- * Fix: Don't include the URL's fragment in `encodedQuery()` when the query
- itself is empty.
-
-## Version 3.9.0
-
-_2017-09-03_
-
- * **Interceptors are more capable.** The `Chain` interface now offers access
- to the call and can adjust all call timeouts. Note that this change is
- source-incompatible for code that implements the `Chain` interface.
- We don't expect this to be a problem in practice!
-
- * **OkHttp has an experimental new API for tracking metrics.** The new
- `EventListener` API is designed to help developers monitor HTTP requests'
- size and duration. This feature is an unstable preview: the API is subject
- to change, and the implementation is incomplete. This is a big new API we
- are eager for feedback.
-
- * New: Support ALPN via Google Play Services' Dynamic Security Provider. This
- expands HTTP/2 support to older Android devices that have Google Play
- Services.
- * New: Consider all routes when looking for candidate coalesced connections.
- This increases the likelihood that HTTP/2 connections will be shared.
- * New: Authentication challenges and credentials now use a charset. Use this in
- your authenticator to support user names and passwords with non-ASCII
- characters.
- * New: Accept a charset in `FormBody.Builder`. Previously form bodies were
- always UTF-8.
- * New: Support the `immutable` cache-control directive.
- * Fix: Don't crash when an HTTP/2 call is redirected while the connection is
- being shut down.
- * Fix: Don't drop headers of healthy streams that raced with `GOAWAY` frames.
- This bug would cause HTTP/2 streams to occasional hang when the connection
- was shutting down.
- * Fix: Honor `OkHttpClient.retryOnConnectionFailure()` when the response is a
- HTTP 408 Request Timeout. If retries are enabled, OkHttp will retry exactly
- once in response to a 408.
- * Fix: Don't crash when reading the empty `HEAD` response body if it specifies
- a `Content-Length`.
- * Fix: Don't crash if the thread is interrupted while reading the public
- suffix database.
- * Fix: Use relative resource path when loading the public suffix database.
- Loading the resource using a path relative to the class prevents conflicts
- when the OkHttp classes are relocated (shaded) by allowing multiple private
- copies of the database.
- * Fix: Accept cookies for URLs that have an IPv6 address for a host.
- * Fix: Don't log the protocol (HTTP/1.1, h2) in HttpLoggingInterceptor if the
- protocol isn't negotiated yet! Previously we'd log HTTP/1.1 by default, and
- this was confusing.
- * Fix: Omit the message from MockWebServer's HTTP/2 `:status` header.
- * Fix: Handle 'Expect: 100 Continue' properly in MockWebServer.
-
-
-## Version 3.8.1
-
-_2017-06-18_
-
- * Fix: Recover gracefully from stale coalesced connections. We had a bug where
- connection coalescing (introduced in OkHttp 3.7.0) and stale connection
- recovery could interact to cause a `NoSuchElementException` crash in the
- `RouteSelector`.
-
-
-## Version 3.8.0
-
-_2017-05-13_
-
-
- * **OkHttp now uses `@Nullable` to annotate all possibly-null values.** We've
- added a compile-time dependency on the JSR 305 annotations. This is a
- [provided][maven_provided] dependency and does not need to be included in
- your build configuration, `.jar` file, or `.apk`. We use
- `@ParametersAreNonnullByDefault` and all parameters and return types are
- never null unless explicitly annotated `@Nullable`.
-
- * **Warning: this release is source-incompatible for Kotlin users.**
- Nullability was previously ambiguous and lenient but now the compiler will
- enforce strict null checks.
-
- * New: The response message is now non-null. This is the "Not Found" in the
- status line "HTTP 404 Not Found". If you are building responses
- programmatically (with `new Response.Builder()`) you must now always supply
- a message. An empty string `""` is permitted. This value was never null on
- responses returned by OkHttp itself, and it was an old mistake to permit
- application code to omit a message.
-
- * The challenge's scheme and realm are now non-null. If you are calling
- `new Challenge(scheme, realm)` you must provide non-null values. These were
- never null in challenges created by OkHttp, but could have been null in
- application code that creates challenges.
-
- * New: The `TlsVersion` of a `Handshake` is now non-null. If you are calling
- `Handshake.get()` with a null TLS version, you must instead now provide a
- non-null `TlsVersion`. Cache responses persisted prior to OkHttp 3.0 did not
- store a TLS version; for these unknown values the handshake is defaulted to
- `TlsVersion.SSL_3_0`.
-
- * New: Upgrade to Okio 1.13.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.13.0
-
-
- com.squareup.okio:okio:1.13.0
- ```
-
- * Fix: gracefully recover when Android 7.0's sockets throw an unexpected
- `NullPointerException`.
-
-## Version 3.7.0
-
-_2017-04-15_
-
- * **OkHttp no longer recovers from TLS handshake failures by attempting a TLSv1 connection.**
- The fallback was necessary for servers that implemented version negotiation incorrectly. Now
- that 99.99% of servers do it right this fallback is obsolete.
- * Fix: Do not honor cookies set on a public domain. Previously a malicious site could inject
- cookies on top-level domains like `co.uk` because our cookie parser didn't honor the [public
- suffix][public_suffix] list. Alongside this fix is a new API, `HttpUrl.topPrivateDomain()`,
- which returns the privately domain name if the URL has one.
- * Fix: Change `MediaType.charset()` to return null for unexpected charsets.
- * Fix: Don't skip cache invalidation if the invalidating response has no body.
- * Fix: Don't use a cryptographic random number generator for web sockets. Some Android devices
- implement `SecureRandom` incorrectly!
- * Fix: Correctly canonicalize IPv6 addresses in `HttpUrl`. This prevented OkHttp from trusting
- HTTPS certificates issued to certain IPv6 addresses.
- * Fix: Don't reuse connections after an unsuccessful `Expect: 100-continue`.
- * Fix: Handle either `TLS_` or `SSL_` prefixes for cipher suite names. This is necessary for
- IBM JVMs that use the `SSL_` prefix exclusively.
- * Fix: Reject HTTP/2 data frames if the stream ID is 0.
- * New: Upgrade to Okio 1.12.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.12.0
-
-
- com.squareup.okio:okio:1.12.0
- ```
-
- * New: Connection coalescing. OkHttp may reuse HTTP/2 connections across calls that share an IP
- address and HTTPS certificate, even if their domain names are different.
- * New: MockWebServer's `RecordedRequest` exposes the requested `HttpUrl` with `getRequestUrl()`.
-
-
-## Version 3.6.0
-
-_2017-01-29_
-
- * Fix: Don't crash with a "cache is closed" error when there is an error initializing the cache.
- * Fix: Calling `disconnect()` on a connecting `HttpUrlConnection` could cause it to retry in an
- infinite loop! This regression was introduced in OkHttp 2.7.0.
- * Fix: Drop cookies that contain ASCII NULL and other bad characters. Previously such cookies
- would cause OkHttp to crash when they were included in a request.
- * Fix: Release duplicated multiplexed connections. If we concurrently establish connections to an
- HTTP/2 server, close all but the first connection.
- * Fix: Fail the HTTP/2 connection if first frame isn't `SETTINGS`.
- * Fix: Forbid spaces in header names.
- * Fix: Don't offer to do gzip if the request is partial.
- * Fix: MockWebServer is now usable with JUnit 5. That update [broke the rules][junit_5_rules].
- * New: Support `Expect: 100-continue` as a request header. Callers can use this header to
- pessimistically hold off on transmitting a request body until a server gives the go-ahead.
- * New: Permit network interceptors to rewrite the host header for HTTP/2. This makes it possible
- to do domain fronting.
- * New: charset support for `Credentials.basic()`.
-
-
-## Version 3.5.0
-
-_2016-11-30_
-
- * **Web Sockets are now a stable feature of OkHttp.** Since being introduced as a beta feature in
- OkHttp 2.3 our web socket client has matured. Connect to a server's web socket with
- `OkHttpClient.newWebSocket()`, send messages with `send()`, and receive messages with the
- `WebSocketListener`.
-
- The `okhttp-ws` submodule is no longer available and `okhttp-ws` artifacts from previous
- releases of OkHttp are not compatible with OkHttp 3.5. When upgrading to the new package
- please note that the `WebSocket` and `WebSocketCall` classes have been merged. Sending messages
- is now asynchronous and they may be enqueued before the web socket is connected.
-
- * **OkHttp no longer attempts a direct connection if the system's HTTP proxy fails.** This
- behavior was surprising because OkHttp was disregarding the user's specified configuration. If
- you need to customize proxy fallback behavior, implement your own `java.net.ProxySelector`.
-
- * Fix: Support TLSv1.3 on devices that support it.
-
- * Fix: Share pooled connections across equivalent `OkHttpClient` instances. Previous releases had
- a bug where a shared connection pool did not guarantee shared connections in some cases.
- * Fix: Prefer the server's response body on all conditional cache misses. Previously we would
- return the cached response's body if it had a newer `Last-Modified` date.
- * Fix: Update the stored timestamp on conditional cache hits.
- * New: Optimized HTTP/2 request header encoding. More headers are HPACK-encoded and string
- literals are now Huffman-encoded.
- * New: Expose `Part` headers and body in `Multipart`.
- * New: Make `ResponseBody.string()` and `ResponseBody.charStream()` BOM-aware. If your HTTP
- response body begins with a [byte order mark][bom] it will be consumed and used to select a
- charset for the remaining bytes. Most applications should not need a byte order mark.
-
- * New: Upgrade to Okio 1.11.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.11.0
-
-
- com.squareup.okio:okio:1.11.0
- ```
-
- * Fix: Avoid sending empty HTTP/2 data frames when there is no request body.
- * Fix: Add a leading `.` for better domain matching in `JavaNetCookieJar`.
- * Fix: Gracefully recover from HTTP/2 connection shutdowns at start of request.
- * Fix: Be lenient if a `MediaType`'s character set is `'single-quoted'`.
- * Fix: Allow horizontal tab characters in header values.
- * Fix: When parsing HTTP authentication headers permit challenge parameters in any order.
-
-
-## Version 3.4.2
-
-_2016-11-03_
-
- * Fix: Recover gracefully when an HTTP/2 connection is shutdown. We had a
- bug where shutdown HTTP/2 connections were considered usable. This caused
- infinite loops when calls attempted to recover.
-
-
-## Version 3.4.1
-
-_2016-07-10_
-
- * **Fix a major bug in encoding HTTP headers.** In 3.4.0 and 3.4.0-RC1 OkHttp
- had an off-by-one bug in our HPACK encoder. This bug could have caused the
- wrong headers to be emitted after a sequence of HTTP/2 requests! Everyone
- who is using OkHttp 3.4.0 or 3.4.0-RC1 should upgrade for this bug fix.
-
-
-## Version 3.4.0
-
-_2016-07-08_
-
- * New: Support dynamic table size changes to HPACK Encoder.
- * Fix: Use `TreeMap` in `Headers.toMultimap()`. This makes string lookups on
- the returned map case-insensitive.
- * Fix: Don't share the OkHttpClient's `Dispatcher` in `HttpURLConnection`.
-
-
-## Version 3.4.0-RC1
-
-_2016-07-02_
-
- * **We’ve rewritten HttpURLConnection and HttpsURLConnection.** Previously we
- shared a single HTTP engine between two frontend APIs: `HttpURLConnection`
- and `Call`. With this release we’ve rearranged things so that the
- `HttpURLConnection` frontend now delegates to the `Call` APIs internally.
- This has enabled substantial simplifications and optimizations in the OkHttp
- core for both frontends.
-
- For most HTTP requests the consequences of this change will be negligible.
- If your application uses `HttpURLConnection.connect()`,
- `setFixedLengthStreamingMode()`, or `setChunkedStreamingMode()`, OkHttp will
- now use a async dispatcher thread to establish the HTTP connection.
-
- We don’t expect this change to have any behavior or performance
- consequences. Regardless, please exercise your `OkUrlFactory` and
- `HttpURLConnection` code when applying this update.
-
- * **Cipher suites may now have arbitrary names.** Previously `CipherSuite` was
- a Java enum and it was impossible to define new cipher suites without first
- upgrading OkHttp. With this change it is now a regular Java class with
- enum-like constants. Application code that uses enum methods on cipher
- suites (`ordinal()`, `name()`, etc.) will break with this change.
-
- * Fix: `CertificatePinner` now matches canonicalized hostnames. Previously
- this was case sensitive. This change should also make it easier to configure
- certificate pinning for internationalized domain names.
- * Fix: Don’t crash on non-ASCII `ETag` headers. Previously OkHttp would reject
- these headers when validating a cached response.
- * Fix: Don’t allow remote peer to arbitrarily size the HPACK decoder dynamic
- table.
- * Fix: Honor per-host configuration in Android’s network security config.
- Previously disabling cleartext for any host would disable cleartext for all
- hosts. Note that this setting is only available on Android 24+.
- * New: HPACK compression is now dynamic. This should improve performance when
- transmitting request headers over HTTP/2.
- * New: `Dispatcher.setIdleCallback()` can be used to signal when there are no
- calls in flight. This is useful for [testing with
- Espresso][okhttp_idling_resource].
- * New: Upgrade to Okio 1.9.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.9.0
-
- ```
-
-
-## Version 3.3.1
-
-_2016-05-28_
-
- * Fix: The plaintext check in HttpLoggingInterceptor incorrectly classified
- newline characters as control characters. This is fixed.
- * Fix: Don't crash reading non-ASCII characters in HTTP/2 headers or in cached
- HTTP headers.
- * Fix: Retain the response body when an attempt to open a web socket returns a
- non-101 response code.
-
-
-## Version 3.3.0
-
-_2016-05-24_
-
- * New: `Response.sentRequestAtMillis()` and `receivedResponseAtMillis()`
- methods track the system's local time when network calls are made. These
- replace the `OkHttp-Sent-Millis` and `OkHttp-Received-Millis` headers that were
- present in earlier versions of OkHttp.
- * New: Accept user-provided trust managers in `OkHttpClient.Builder`. This
- allows OkHttp to satisfy its TLS requirements directly. Otherwise OkHttp
- will use reflection to extract the `TrustManager` from the
- `SSLSocketFactory`.
- * New: Support prerelease Java 9. This gets ALPN from the platform rather than
- relying on the alpn-boot bootclasspath override.
- * New: `HttpLoggingInterceptor` now logs connection failures.
- * New: Upgrade to Okio 1.8.0.
-
- ```xml
-
- com.squareup.okio
- okio
- 1.8.0
-
- ```
-
- * Fix: Gracefully recover from a failure to rebuild the cache journal.
- * Fix: Don't corrupt cache entries when a cache entry is evicted while it is
- being updated.
- * Fix: Make logging more consistent throughout OkHttp.
- * Fix: Log plaintext bodies only. This uses simple heuristics to differentiate
- text from other data.
- * Fix: Recover from `REFUSED_STREAM` errors in HTTP/2. This should improve
- interoperability with Nginx 1.10.0, which [refuses][nginx_959] streams
- created before HTTP/2 settings have been acknowledged.
- * Fix: Improve recovery from failed routes.
- * Fix: Accommodate tunneling proxies that close the connection after an auth
- challenge.
- * Fix: Use the proxy authenticator when authenticating HTTP proxies. This
- regression was introduced in OkHttp 3.0.
- * Fix: Fail fast if network interceptors transform the response body such that
- closing it doesn't also close the underlying stream. We had a bug where
- OkHttp would attempt to reuse a connection but couldn't because it was still
- held by a prior request.
- * Fix: Ensure network interceptors always have access to the underlying
- connection.
- * Fix: Use `X509TrustManagerExtensions` on Android 17+.
- * Fix: Unblock waiting dispatchers on MockWebServer shutdown.
-
-
-## Version 3.2.0
-
-_2016-02-25_
-
- * Fix: Change the certificate pinner to always build full chains. This
- prevents a potential crash when using certificate pinning with the Google
- Play Services security provider.
- * Fix: Make IPv6 request lines consistent with Firefox and Chrome.
- * Fix: Recover gracefully when trimming the response cache fails.
- * New: Add multiple path segments using a single string in `HttpUrl.Builder`.
- * New: Support SHA-256 pins in certificate pinner.
-
-
-## Version 3.1.2
-
-_2016-02-10_
-
- * Fix: Don’t crash when finding the trust manager on Robolectric. We attempted
- to detect the host platform and got confused because Robolectric looks like
- Android but isn’t!
- * Fix: Change `CertificatePinner` to skip sanitizing the certificate chain
- when no certificates were pinned. This avoids an SSL failure in insecure
- “trust everyone” configurations, such as when talking to a development
- HTTPS server that has a self-signed certificate.
-
-
-## Version 3.1.1
-
-_2016-02-07_
-
- * Fix: Don't crash when finding the trust manager if the Play Services (GMS)
- security provider is installed.
- * Fix: The previous release introduced a performance regression on Android,
- caused by looking up CA certificates. This is now fixed.
-
-
-## Version 3.1.0
-
-_2016-02-06_
-
- * New: WebSockets now defer some writes. This should improve performance for
- some applications.
- * New: Override `equals()` and `hashCode()` in our new cookie class. This
- class now defines equality by value rather than by reference.
- * New: Handle 408 responses by retrying the request. This allows servers to
- direct clients to retry rather than failing permanently.
- * New: Expose the framed protocol in `Connection`. Previously this would
- return the application-layer protocol (HTTP/1.1 or HTTP/1.0); now it always
- returns the wire-layer protocol (HTTP/2, SPDY/3.1, or HTTP/1.1).
- * Fix: Permit the trusted CA root to be pinned by `CertificatePinner`.
- * Fix: Silently ignore unknown HTTP/2 settings. Previously this would cause
- the entire connection to fail.
- * Fix: Don’t crash on unexpected charsets in the logging interceptor.
- * Fix: `OkHttpClient` is now non-final for the benefit of mocking frameworks.
- Mocking sophisticated classes like `OkHttpClient` is fragile and you
- shouldn’t do it. But if that’s how you want to live your life we won’t stand
- in your way!
-
-
-## Version 3.0.1
-
-_2016-01-14_
-
- * Rollback OSGi support. This was causing library jars to include more classes
- than expected, which interfered with Gradle builds.
-
-
-## Version 3.0.0
-
-_2016-01-13_
-
-This release commits to a stable 3.0 API. Read the 3.0.0-RC1 changes for advice
-on upgrading from 2.x to 3.x.
-
- * **The `Callback` interface now takes a `Call`**. This makes it easier to
- check if the call was canceled from within the callback. When migrating
- async calls to this new API, `Call` is now the first parameter for both
- `onResponse()` and `onFailure()`.
- * Fix: handle multiple cookies in `JavaNetCookieJar` on Android.
- * Fix: improve the default HTTP message in MockWebServer responses.
- * Fix: don't leak file handles when a conditional GET throws.
- * Fix: Use charset specified by the request body content type in OkHttp's
- logging interceptor.
- * Fix: Don't eagerly release pools on cache hits.
- * New: Make OkHttp OSGi ready.
- * New: Add already-implemented interfaces Closeable and Flushable to the cache.
-
-## Version 3.0.0-RC1
-
-_2016-01-02_
-
-OkHttp 3 is a major release focused on API simplicity and consistency. The API
-changes are numerous but most are cosmetic. Applications should be able to
-upgrade from the 2.x API to the 3.x API mechanically and without risk.
-
-Because the release includes breaking API changes, we're changing the project's
-package name from `com.squareup.okhttp` to `okhttp3`. This should make it
-possible for large applications to migrate incrementally. The Maven group ID
-is now `com.squareup.okhttp3`. For an explanation of this strategy, see Jake
-Wharton's post, [Java Interoperability Policy for Major Version
-Updates][major_versions].
-
-This release obsoletes OkHttp 2.x, and all code that uses OkHttp's
-`com.squareup.okhttp` package should upgrade to the `okhttp3` package. Libraries
-that depend on OkHttp should upgrade quickly to prevent applications from being
-stuck on the old version.
-
- * **There is no longer a global singleton connection pool.** In OkHttp 2.x,
- all `OkHttpClient` instances shared a common connection pool by default.
- In OkHttp 3.x, each new `OkHttpClient` gets its own private connection pool.
- Applications should avoid creating many connection pools as doing so
- prevents connection reuse. Each connection pool holds its own set of
- connections alive so applications that have many pools also risk exhausting
- memory!
-
- The best practice in OkHttp 3 is to create a single OkHttpClient instance
- and share it throughout the application. Requests that needs a customized
- client should call `OkHttpClient.newBuilder()` on that shared instance.
- This allows customization without the drawbacks of separate connection
- pools.
-
- * **OkHttpClient is now stateless.** In the 2.x API `OkHttpClient` had getters
- and setters. Internally each request was forced to make its own complete
- snapshot of the `OkHttpClient` instance to defend against racy configuration
- changes. In 3.x, `OkHttpClient` is now stateless and has a builder. Note
- that this class is not strictly immutable as it has stateful members like
- the connection pool and cache.
-
- * **Get and Set prefixes are now avoided.** With ubiquitous builders
- throughout OkHttp these accessor prefixes aren't necessary. Previously
- OkHttp used _get_ and _set_ prefixes sporadically which make the API
- inconsistent and awkward to explore.
-
- * **OkHttpClient now implements the new `Call.Factory` interface.** This
- interface will make your code easier to test. When you test code that makes
- HTTP requests, you can use this interface to replace the real `OkHttpClient`
- with your own mocks or fakes.
-
- The interface will also let you use OkHttp's API with another HTTP client's
- implementation. This is useful in sandboxed environments like Google App
- Engine.
-
- * **OkHttp now does cookies.** We've replaced `java.net.CookieHandler` with
- a new interface, `CookieJar` and added our own `Cookie` model class. This
- new cookie follows the latest RFC and supports the same cookie attributes
- as modern web browsers.
-
- * **Form and Multipart bodies are now modeled.** We've replaced the opaque
- `FormEncodingBuilder` with the more powerful `FormBody` and
- `FormBody.Builder` combo. Similarly we've upgraded `MultipartBuilder` into
- `MultipartBody`, `MultipartBody.Part`, and `MultipartBody.Builder`.
-
- * **The Apache HTTP client and HttpURLConnection APIs are deprecated.** They
- continue to work as they always have, but we're moving everything to the new
- OkHttp 3 API. The `okhttp-apache` and `okhttp-urlconnection` modules should
- be only be used to accelerate a transition to OkHttp's request/response API.
- These deprecated modules will be dropped in an upcoming OkHttp 3.x release.
-
- * **Canceling batches of calls is now the application's responsibility.**
- The API to cancel calls by tag has been removed and replaced with a more
- general mechanism. The dispatcher now exposes all in-flight calls via its
- `runningCalls()` and `queuedCalls()` methods. You can write code that
- selects calls by tag, host, or whatever, and invokes `Call.cancel()` on the
- ones that are no longer necessary.
-
- * **OkHttp no longer uses the global `java.net.Authenticator` by default.**
- We've changed our `Authenticator` interface to authenticate web and proxy
- authentication failures through a single method. An adapter for the old
- authenticator is available in the `okhttp-urlconnection` module.
-
- * Fix: Don't throw `IOException` on `ResponseBody.contentLength()` or `close()`.
- * Fix: Never throw converting an `HttpUrl` to a `java.net.URI`. This changes
- the `uri()` method to handle malformed percent-escapes and characters
- forbidden by `URI`.
- * Fix: When a connect times out, attempt an alternate route. Previously route
- selection was less efficient when differentiating failures.
- * New: `Response.peekBody()` lets you access the response body without
- consuming it. This may be handy for interceptors!
- * New: `HttpUrl.newBuilder()` resolves a link to a builder.
- * New: Add the TLS version to the `Handshake`.
- * New: Drop `Request.uri()` and `Request#urlString()`. Just use
- `Request.url().uri()` and `Request.url().toString()`.
- * New: Add URL to HTTP response logging.
- * New: Make `HttpUrl` the blessed URL method of `Request`.
-
-
-## Version 2.7.5
-
-_2016-02-25_
-
- * Fix: Change the certificate pinner to always build full chains. This
- prevents a potential crash when using certificate pinning with the Google
- Play Services security provider.
-
-
-## Version 2.7.4
-
-_2016-02-07_
-
- * Fix: Don't crash when finding the trust manager if the Play Services (GMS)
- security provider is installed.
- * Fix: The previous release introduced a performance regression on Android,
- caused by looking up CA certificates. This is now fixed.
-
-
-## Version 2.7.3
-
-_2016-02-06_
-
- * Fix: Permit the trusted CA root to be pinned by `CertificatePinner`.
-
-
-## Version 2.7.2
-
-_2016-01-07_
-
- * Fix: Don't eagerly release stream allocations on cache hits. We might still
- need them to handle redirects.
-
-
-## Version 2.7.1
-
-_2016-01-01_
-
- * Fix: Don't do a health check on newly-created connections. This is
- unnecessary work that could put the client in an inconsistent state if the
- health check fails.
-
-
-## Version 2.7.0
-
-_2015-12-13_
-
- * **Rewritten connection management.** Previously OkHttp's connection pool
- managed both idle and active connections for HTTP/2, but only idle
- connections for HTTP/1.x. With this update the connection pool manages both
- idle and active connections for everything. OkHttp now detects and warns on
- connections that were allocated but never released, and will enforce HTTP/2
- stream limits. This update also fixes `Call.cancel()` to not do I/O on the
- calling thread.
- * Fix: Don't log gzipped data in the logging interceptor.
- * Fix: Don't resolve DNS addresses when connecting through a SOCKS proxy.
- * Fix: Drop the synthetic `OkHttp-Selected-Protocol` response header.
- * Fix: Support 204 and 205 'No Content' replies in the logging interceptor.
- * New: Add `Call.isExecuted()`.
-
-
-## Version 2.6.0
-
-_2015-11-22_
-
- * **New Logging Interceptor.** The `logging-interceptor` subproject offers
- simple request and response logging. It may be configured to log headers and
- bodies for debugging. It requires this Maven dependency:
-
- ```xml
-
- com.squareup.okhttp
- logging-interceptor
- 2.6.0
-
- ```
-
- Configure basic logging like this:
-
- ```java
- HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
- loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
- client.networkInterceptors().add(loggingInterceptor);
- ```
-
- **Warning:** Avoid `Level.HEADERS` and `Level.BODY` in production because
- they could leak passwords and other authentication credentials to insecure
- logs.
-
- * **WebSocket API now uses `RequestBody` and `ResponseBody` for messages.**
- This is a backwards-incompatible API change.
-
- * **The DNS service is now pluggable.** In some situations this may be useful
- to manually prioritize specific IP addresses.
-
- * Fix: Don't throw when converting an `HttpUrl` to a `java.net.URI`.
- Previously URLs with special characters like `|` and `[` would break when
- subjected to URI’s overly-strict validation.
- * Fix: Don't re-encode `+` as `%20` in encoded URL query strings. OkHttp
- prefers `%20` when doing its own encoding, but will retain `+` when that is
- provided.
- * Fix: Enforce that callers call `WebSocket.close()` on IO errors. Error
- handling in WebSockets is significantly improved.
- * Fix: Don't use SPDY/3 style header concatenation for HTTP/2 request headers.
- This could have corrupted requests where multiple headers had the same name,
- as in cookies.
- * Fix: Reject bad characters in the URL hostname. Previously characters like
- `\0` would cause a late crash when building the request.
- * Fix: Allow interceptors to change the request method.
- * Fix: Don’t use the request's `User-Agent` or `Proxy-Authorization` when
- connecting to an HTTPS server via an HTTP tunnel. The `Proxy-Authorization`
- header was being leaked to the origin server.
- * Fix: Digits may be used in a URL scheme.
- * Fix: Improve connection timeout recovery.
- * Fix: Recover from `getsockname` crashes impacting Android releases prior to
- 4.2.2.
- * Fix: Drop partial support for HTTP/1.0. Previously OkHttp would send
- `HTTP/1.0` on connections after seeing a response with `HTTP/1.0`. The fixed
- behavior is consistent with Firefox and Chrome.
- * Fix: Allow a body in `OPTIONS` requests.
- * Fix: Don't percent-encode non-ASCII characters in URL fragments.
- * Fix: Handle null fragments.
- * Fix: Don’t crash on interceptors that throw `IOException` before a
- connection is attempted.
- * New: Support [WebDAV][webdav] HTTP methods.
- * New: Buffer WebSocket frames for better performance.
- * New: Drop support for `TLS_DHE_DSS_WITH_AES_128_CBC_SHA`, our only remaining
- DSS cipher suite. This is consistent with Firefox and Chrome which have also
- dropped these cipher suite.
-
-## Version 2.5.0
-
-_2015-08-25_
-
- * **Timeouts now default to 10 seconds.** Previously we defaulted to never
- timing out, and that was a lousy policy. If establishing a connection,
- reading the next byte from a connection, or writing the next byte to a
- connection takes more than 10 seconds to complete, you’ll need to adjust
- the timeouts manually.
-
- * **OkHttp now rejects request headers that contain invalid characters.** This
- includes potential security problems (newline characters) as well as simple
- non-ASCII characters (including international characters and emoji).
-
- * **Call canceling is more reliable.** We had a bug where a socket being
- connected wasn't being closed when the application used `Call.cancel()`.
-
- * **Changing a HttpUrl’s scheme now tracks the default port.** We had a bug
- where changing a URL from `http` to `https` would leave it on port 80.
-
- * **Okio has been updated to 1.6.0.**
- ```xml
-
- com.squareup.okio
- okio
- 1.6.0
-
- ```
-
- * New: `Cache.initialize()`. Call this on a background thread to eagerly
- initialize the response cache.
- * New: Fold `MockWebServerRule` into `MockWebServer`. This makes it easier to
- write JUnit tests with `MockWebServer`. The `MockWebServer` library now
- depends on JUnit, though it continues to work with all testing frameworks.
- * Fix: `FormEncodingBuilder` is now consistent with browsers in which
- characters it escapes. Previously we weren’t percent-encoding commas,
- parens, and other characters.
- * Fix: Relax `FormEncodingBuilder` to support building empty forms.
- * Fix: Timeouts throw `SocketTimeoutException`, not `InterruptedIOException`.
- * Fix: Change `MockWebServer` to use the same logic as OkHttp when determining
- whether an HTTP request permits a body.
- * Fix: `HttpUrl` now uses the canonical form for IPv6 addresses.
- * Fix: Use `HttpUrl` internally.
- * Fix: Recover from Android 4.2.2 EBADF crashes.
- * Fix: Don't crash with an `IllegalStateException` if an HTTP/2 or SPDY
- write fails, leaving the connection in an inconsistent state.
- * Fix: Make sure the default user agent is ASCII.
-
-
-## Version 2.4.0
-
-_2015-05-22_
-
- * **Forbid response bodies on HTTP 204 and 205 responses.** Webservers that
- return such malformed responses will now trigger a `ProtocolException` in
- the client.
-
- * **WebSocketListener has incompatible changes.** The `onOpen()` method is now
- called on the reader thread, so implementations must return before further
- websocket messages will be delivered. The `onFailure()` method now includes
- an HTTP response if one was returned.
-
-## Version 2.4.0-RC1
-
-_2015-05-16_
-
- * **New HttpUrl API.** It's like `java.net.URL` but good. Note that
- `Request.Builder.url()` now throws `IllegalArgumentException` on malformed
- URLs. (Previous releases would throw a `MalformedURLException` when calling
- a malformed URL.)
-
- * **We've improved connect failure recovery.** We now differentiate between
- setup, connecting, and connected and implement appropriate recovery rules
- for each. This changes `Address` to no longer use `ConnectionSpec`. (This is
- an incompatible API change).
-
- * **`FormEncodingBuilder` now uses `%20` instead of `+` for encoded spaces.**
- Both are permitted-by-spec, but `%20` requires fewer special cases.
-
- * **Okio has been updated to 1.4.0.**
- ```xml
-
- com.squareup.okio
- okio
- 1.4.0
-
- ```
-
- * **`Request.Builder` no longer accepts null if a request body is required.**
- Passing null will now fail for request methods that require a body. Instead
- use an empty body such as this one:
-
- ```java
- RequestBody.create(null, new byte[0]);
- ```
-
- * **`CertificatePinner` now supports wildcard hostnames.** As always with
- certificate pinning, you must be very careful to avoid [bricking][brick]
- your app. You'll need to pin both the top-level domain and the `*.` domain
- for full coverage.
-
- ```java
- client.setCertificatePinner(new CertificatePinner.Builder()
- .add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
- .add("*.publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
- .add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
- .add("*.publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
- .add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
- .add("*.publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
- .add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
- .add("*.publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
- .build());
- ```
-
- * **Interceptors lists are now deep-copied by `OkHttpClient.clone()`.**
- Previously clones shared interceptors, which made it difficult to customize
- the interceptors on a request-by-request basis.
-
- * New: `Headers.toMultimap()`.
- * New: `RequestBody.create(MediaType, ByteString)`.
- * New: `ConnectionSpec.isCompatible(SSLSocket)`.
- * New: `Dispatcher.getQueuedCallCount()` and
- `Dispatcher.getRunningCallCount()`. These can be useful in diagnostics.
- * Fix: OkHttp no longer shares timeouts between pooled connections. This was
- causing some applications to crash when connections were reused.
- * Fix: `OkApacheClient` now allows an empty `PUT` and `POST`.
- * Fix: Websockets no longer rebuffer socket streams.
- * Fix: Websockets are now better at handling close frames.
- * Fix: Content type matching is now case insensitive.
- * Fix: `Vary` headers are not lost with `android.net.http.HttpResponseCache`.
- * Fix: HTTP/2 wasn't enforcing stream timeouts when writing the underlying
- connection. Now it is.
- * Fix: Never return null on `call.proceed()`. This was a bug in call
- cancelation.
- * Fix: When a network interceptor mutates a request, that change is now
- reflected in `Response.networkResponse()`.
- * Fix: Badly-behaving caches now throw a checked exception instead of a
- `NullPointerException`.
- * Fix: Better handling of uncaught exceptions in MockWebServer with HTTP/2.
-
-## Version 2.3.0
-
-_2015-03-16_
-
- * **HTTP/2 support.** We've done interop testing and haven't seen any
- problems. HTTP/2 support has been a big effort and we're particularly
- thankful to Adrian Cole who has helped us to reach this milestone.
-
- * **RC4 cipher suites are no longer supported by default.** To connect to
- old, obsolete servers relying on these cipher suites, you must create a
- custom `ConnectionSpec`.
-
- * **Beta WebSockets support.**. The `okhttp-ws` subproject offers a new
- websockets client. Please try it out! When it's ready we intend to include
- it with the core OkHttp library.
-
- * **Okio updated to 1.3.0.**
-
- ```xml
-
- com.squareup.okio
- okio
- 1.3.0
-
- ```
-
- * **Fix: improve parallelism of async requests.** OkHttp's Dispatcher had a
- misconfigured `ExecutorService` that limited the number of worker threads.
- If you're using `Call.enqueue()` this update should significantly improve
- request concurrency.
-
- * **Fix: Lazily initialize the response cache.** This avoids strict mode
- warnings when initializing OkHttp on Android‘s main thread.
-
- * **Fix: Disable ALPN on Android 4.4.** That release of the feature was
- unstable and prone to native crashes in the underlying OpenSSL code.
- * Fix: Don't send both `If-None-Match` and `If-Modified-Since` cache headers
- when both are applicable.
- * Fix: Fail early when a port is out of range.
- * Fix: Offer `Content-Length` headers for multipart request bodies.
- * Fix: Throw `UnknownServiceException` if a cleartext connection is attempted
- when explicitly forbidden.
- * Fix: Throw a `SSLPeerUnverifiedException` when host verification fails.
- * Fix: MockWebServer explicitly closes sockets. (On some Android releases,
- closing the input stream and output stream of a socket is not sufficient.
- * Fix: Buffer outgoing HTTP/2 frames to limit how many outgoing frames are
- created.
- * Fix: Avoid crashing when cache writing fails due to a full disk.
- * Fix: Improve caching of private responses.
- * Fix: Update cache-by-default response codes.
- * Fix: Reused `Request.Builder` instances no longer hold stale URL fields.
- * New: ConnectionSpec can now be configured to use the SSL socket's default
- cipher suites. To use, set the cipher suites to `null`.
- * New: Support `DELETE` with a request body.
- * New: `Headers.of(Map)` creates headers from a Map.
-
-
-## Version 2.2.0
-
-_2014-12-30_
-
- * **`RequestBody.contentLength()` now throws `IOException`.**
- This is a source-incompatible change. If you have code that calls
- `RequestBody.contentLength()`, your compile will break with this
- update. The change is binary-compatible, however: code compiled
- for OkHttp 2.0 and 2.1 will continue to work with this update.
-
- * **`COMPATIBLE_TLS` no longer supports SSLv3.** In response to the
- [POODLE](https://googleonlinesecurity.blogspot.ca/2014/10/this-poodle-bites-exploiting-ssl-30.html)
- vulnerability, OkHttp no longer offers SSLv3 when negotiation an
- HTTPS connection. If you continue to need to connect to webservers
- running SSLv3, you must manually configure your own `ConnectionSpec`.
-
- * **OkHttp now offers interceptors.** Interceptors are a powerful mechanism
- that can monitor, rewrite, and retry calls. The [interceptors doc][interceptors] is a full
- introduction to this new API.
-
- * New: APIs to iterate and selectively clear the response cache.
- * New: Support for SOCKS proxies.
- * New: Support for `TLS_FALLBACK_SCSV`.
- * New: Update HTTP/2 support to `h2-16` and `hpack-10`.
- * New: APIs to prevent retrying non-idempotent requests.
- * Fix: Drop NPN support. Going forward we support ALPN only.
- * Fix: The hostname verifier is now strict. This is consistent with the hostname
- verifier in modern browsers.
- * Fix: Improve `CONNECT` handling for misbehaving HTTP proxies.
- * Fix: Don't retry requests that failed due to timeouts.
- * Fix: Cache 302s and 308s that include appropriate response headers.
- * Fix: Improve pooling of connections that use proxy selectors.
- * Fix: Don't leak connections when using ALPN on the desktop.
- * Fix: Update Jetty ALPN to `7.1.2.v20141202` (Java 7) and `8.1.2.v20141202` (Java 8).
- This fixes a bug in resumed TLS sessions where the wrong protocol could be
- selected.
- * Fix: Don't crash in SPDY and HTTP/2 when disconnecting before connecting.
- * Fix: Avoid a reverse DNS-lookup for a numeric proxy address
- * Fix: Resurrect http/2 frame logging.
- * Fix: Limit to 20 authorization attempts.
-
-## Version 2.1.0
-
-_2014-11-11_
-
- * New: Typesafe APIs for interacting with cipher suites and TLS versions.
- * Fix: Don't crash when mixing authorization challenges with upload retries.
-
-
-## Version 2.1.0-RC1
-
-_2014-11-04_
-
- * **OkHttp now caches private responses**. We've changed from a shared cache
- to a private cache, and will now store responses that use an `Authorization`
- header. This means OkHttp's cache shouldn't be used on middleboxes that sit
- between user agents and the origin server.
-
- * **TLS configuration updated.** OkHttp now explicitly enables TLSv1.2,
- TLSv1.1 and TLSv1.0 where they are supported. It will continue to perform
- only one fallback, to SSLv3. Applications can now configure this with the
- `ConnectionSpec` class.
-
- To disable TLS fallback:
-
- ```java
- client.setConnectionSpecs(Arrays.asList(
- ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT));
- ```
-
- To disable cleartext connections, permitting `https` URLs only:
-
- ```java
- client.setConnectionSpecs(Arrays.asList(
- ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS));
- ```
-
- * **New cipher suites.** Please confirm that your webservers are reachable
- with this limited set of cipher suites.
-
- ```
- Android
- Name Version
-
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 5.0
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 5.0
- TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 5.0
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 4.0
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 4.0
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 4.0
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 4.0
- TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 4.0
- TLS_ECDHE_RSA_WITH_RC4_128_SHA 4.0
- TLS_DHE_RSA_WITH_AES_128_CBC_SHA 2.3
- TLS_DHE_DSS_WITH_AES_128_CBC_SHA 2.3
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA 2.3
- TLS_RSA_WITH_AES_128_GCM_SHA256 5.0
- TLS_RSA_WITH_AES_128_CBC_SHA 2.3
- TLS_RSA_WITH_AES_256_CBC_SHA 2.3
- SSL_RSA_WITH_3DES_EDE_CBC_SHA 2.3 (Deprecated in 5.0)
- SSL_RSA_WITH_RC4_128_SHA 2.3
- SSL_RSA_WITH_RC4_128_MD5 2.3 (Deprecated in 5.0)
- ```
-
- * **Okio updated to 1.0.1.**
-
- ```xml
-
- com.squareup.okio
- okio
- 1.0.1
-
- ```
-
- * **New APIs to permit easy certificate pinning.** Be warned, certificate
- pinning is dangerous and could prevent your application from trusting your
- server!
-
- * **Cache improvements.** This release fixes some severe cache problems
- including a bug where the cache could be corrupted upon certain access
- patterns. We also fixed a bug where the cache was being cleared due to a
- corrupted journal. We've added APIs to configure a request's `Cache-Control`
- headers, and to manually clear the cache.
-
- * **Request cancellation fixes.** This update fixes a bug where synchronous
- requests couldn't be canceled by tag. This update avoids crashing when
- `onResponse()` throws an `IOException`. That failure will now be logged
- instead of notifying the thread's uncaught exception handler. We've added a
- new API, `Call.isCanceled()` to check if a call has been canceled.
-
- * New: Update `MultipartBuilder` to support content length.
- * New: Make it possible to mock `OkHttpClient` and `Call`.
- * New: Update to h2-14 and hpack-9.
- * New: OkHttp includes a user-agent by default, like `okhttp/2.1.0-RC1`.
- * Fix: Handle response code `308 Permanent Redirect`.
- * Fix: Don't skip the callback if a call is canceled.
- * Fix: Permit hostnames with underscores.
- * Fix: Permit overriding the content-type in `OkApacheClient`.
- * Fix: Use the socket factory for direct connections.
- * Fix: Honor `OkUrlFactory` APIs that disable redirects.
- * Fix: Don't crash on concurrent modification of `SPDY` SPDY settings.
-
-## Version 2.0.0
-
-This release commits to a stable 2.0 API. Read the 2.0.0-RC1 changes for advice
-on upgrading from 1.x to 2.x.
-
-_2014-06-21_
-
- * **API Change**: Use `IOException` in `Callback.onFailure()`. This is
- a source-incompatible change, and is different from OkHttp 2.0.0-RC2 which
- used `Throwable`.
- * Fix: Fixed a caching bug where we weren't storing rewritten request headers
- like `Accept-Encoding`.
- * Fix: Fixed bugs in handling the SPDY window size. This was stalling certain
- large downloads
- * Update the language level to Java 7. (OkHttp requires Android 2.3+ or Java 7+.)
-
-## Version 2.0.0-RC2
-
-_2014-06-11_
-
-This update fixes problems in 2.0.0-RC1. Read the 2.0.0-RC1 changes for
-advice on upgrading from 1.x to 2.x.
-
- * Fix: Don't leak connections! There was a regression in 2.0.0-RC1 where
- connections were neither closed nor pooled.
- * Fix: Revert builder-style return types from OkHttpClient's timeout methods
- for binary compatibility with OkHttp 1.x.
- * Fix: Don't skip client stream 1 on SPDY/3.1. This fixes SPDY connectivity to
- `https://google.com`, which doesn't follow the SPDY/3.1 spec!
- * Fix: Always configure NPN headers. This fixes connectivity to
- `https://facebook.com` when SPDY and HTTP/2 are both disabled. Otherwise an
- unexpected NPN response is received and OkHttp crashes.
- * Fix: Write continuation frames when HPACK data is larger than 16383 bytes.
- * Fix: Don't drop uncaught exceptions thrown in async calls.
- * Fix: Throw an exception eagerly when a request body is not legal. Previously
- we ignored the problem at request-building time, only to crash later with a
- `NullPointerException`.
- * Fix: Include a backwards-compatible `OkHttp-Response-Source` header with
- `OkUrlFactory `responses.
- * Fix: Don't include a default User-Agent header in requests made with the Call
- API. Requests made with OkUrlFactory will continue to have a default user
- agent.
- * New: Guava-like API to create headers:
-
- ```java
- Headers headers = Headers.of(name1, value1, name2, value2, ...).
- ```
-
- * New: Make the content-type header optional for request bodies.
- * New: `Response.isSuccessful()` is a convenient API to check response codes.
- * New: The response body can now be read outside of the callback. Response
- bodies must always be closed, otherwise they will leak connections!
- * New: APIs to create multipart request bodies (`MultipartBuilder`) and form
- encoding bodies (`FormEncodingBuilder`).
-
-## Version 2.0.0-RC1
-
-_2014-05-23_
-
-OkHttp 2 is designed around a new API that is true to HTTP, with classes for
-requests, responses, headers, and calls. It uses modern Java patterns like
-immutability and chained builders. The API now offers asynchronous callbacks
-in addition to synchronous blocking calls.
-
-#### API Changes
-
- * **New Request and Response types,** each with their own builder. There's also
- a `RequestBody` class to write the request body to the network and a
- `ResponseBody` to read the response body from the network. The standalone
- `Headers` class offers full access to the HTTP headers.
-
- * **Okio dependency added.** OkHttp now depends on
- [Okio](https://github.com/square/okio), an I/O library that makes it easier
- to access, store and process data. Using this library internally makes OkHttp
- faster while consuming less memory. You can write a `RequestBody` as an Okio
- `BufferedSink` and a `ResponseBody` as an Okio `BufferedSource`. Standard
- `InputStream` and `OutputStream` access is also available.
-
- * **New Call and Callback types** execute requests and receive their
- responses. Both types of calls can be canceled via the `Call` or the
- `OkHttpClient`.
-
- * **URLConnection support has moved to the okhttp-urlconnection module.**
- If you're upgrading from 1.x, this change will impact you. You will need to
- add the `okhttp-urlconnection` module to your project and use the
- `OkUrlFactory` to create new instances of `HttpURLConnection`:
-
- ```java
- // OkHttp 1.x:
- HttpURLConnection connection = client.open(url);
-
- // OkHttp 2.x:
- HttpURLConnection connection = new OkUrlFactory(client).open(url);
- ```
-
- * **Custom caches are no longer supported.** In OkHttp 1.x it was possible to
- define your own response cache with the `java.net.ResponseCache` and OkHttp's
- `OkResponseCache` interfaces. Both of these APIs have been dropped. In
- OkHttp 2 the built-in disk cache is the only supported response cache.
-
- * **HttpResponseCache has been renamed to Cache.** Install it with
- `OkHttpClient.setCache(...)` instead of `OkHttpClient.setResponseCache(...)`.
-
- * **OkAuthenticator has been replaced with Authenticator.** This new
- authenticator has access to the full incoming response and can respond with
- whichever followup request is appropriate. The `Challenge` class is now a
- top-level class and `Credential` is replaced with a utility class called
- `Credentials`.
-
- * **OkHttpClient.getFollowProtocolRedirects() renamed to
- getFollowSslRedirects()**. We reserve the word _protocol_ for the HTTP
- version being used (HTTP/1.1, HTTP/2). The old name of this method was
- misleading; it was always used to configure redirects between `https://` and
- `http://` schemes.
-
- * **RouteDatabase is no longer public API.** OkHttp continues to track which
- routes have failed but this is no exposed in the API.
-
- * **ResponseSource is gone.** This enum exposed whether a response came from
- the cache, network, or both. OkHttp 2 offers more detail with raw access to
- the cache and network responses in the new `Response` class.
-
- * **TunnelRequest is gone.** It specified how to connect to an HTTP proxy.
- OkHttp 2 uses the new `Request` class for this.
-
- * **Dispatcher** is a new class that manages the queue of asynchronous calls. It
- implements limits on total in-flight calls and in-flight calls per host.
-
-#### Implementation changes
-
- * Support Android `TrafficStats` socket tagging.
- * Drop authentication headers on redirect.
- * Added support for compressed data frames.
- * Process push promise callbacks in order.
- * Update to http/2 draft 12.
- * Update to HPACK draft 07.
- * Add ALPN support. Maven will use ALPN on OpenJDK 8.
- * Update NPN dependency to target `jdk7u60-b13` and `Oracle jdk7u55-b13`.
- * Ensure SPDY variants support zero-length DELETE and POST.
- * Prevent leaking a cache item's InputStreams when metadata read fails.
- * Use a string to identify TLS versions in routes.
- * Add frame logger for HTTP/2.
- * Replacing `httpMinorVersion` with `Protocol`. Expose HTTP/1.0 as a potential protocol.
- * Use `Protocol` to describe framing.
- * Implement write timeouts for HTTP/1.1 streams.
- * Avoid use of SPDY stream ID 1, as that's typically used for UPGRADE.
- * Support OAuth in `Authenticator`.
- * Permit a dangling semicolon in media type parsing.
-
-## Version 1.6.0
-
-_2014-05-23_
-
- * Offer bridges to make it easier to migrate from OkHttp 1.x to OkHttp 2.0.
- This adds `OkUrlFactory`, `Cache`, and `@Deprecated` annotations for APIs
- dropped in 2.0.
-
-## Version 1.5.4
-
-_2014-04-14_
-
- * Drop ALPN support in Android. There's a concurrency bug in all
- currently-shipping versions.
- * Support asynchronous disconnects by breaking the socket only. This should
- prevent flakiness from multiple threads concurrently accessing a stream.
-
-## Version 1.5.3
-
-_2014-03-29_
-
- * Fix bug where the Content-Length header was not always dropped when
- following a redirect from a POST to a GET.
- * Implement basic support for `Thread.interrupt()`. OkHttp now checks
- for an interruption before doing a blocking call. If it is interrupted,
- it throws an `InterruptedIOException`.
-
-## Version 1.5.2
-
-_2014-03-17_
-
- * Fix bug where deleting a file that was absent from the `HttpResponseCache`
- caused an IOException.
- * Fix bug in HTTP/2 where our HPACK decoder wasn't emitting entries in
- certain eviction scenarios, leading to dropped response headers.
-
-## Version 1.5.1
-
-_2014-03-11_
-
- * Fix 1.5.0 regression where connections should not have been recycled.
- * Fix 1.5.0 regression where transparent Gzip was broken by attempting to
- recover from another I/O failure.
- * Fix problems where spdy/3.1 headers may not have been compressed properly.
- * Fix problems with spdy/3.1 and http/2 where the wrong window size was being
- used.
- * Fix 1.5.0 regression where conditional cache responses could corrupt the
- connection pool.
-
-
-## Version 1.5.0
-
-_2014-03-07_
-
-
-##### OkHttp no longer uses the default SSL context.
-
-Applications that want to use the global SSL context with OkHttp should configure their
-OkHttpClient instances with the following:
-
-```java
-okHttpClient.setSslSocketFactory(HttpsURLConnection.getDefaultSSLSocketFactory());
-```
-
-A simpler solution is to avoid the shared default SSL socket factory. Instead, if you
-need to customize SSL, do so for your specific OkHttpClient instance only.
-
-##### Synthetic headers have changed
-
-Previously OkHttp added a synthetic response header, `OkHttp-Selected-Transport`. It
-has been replaced with a new synthetic header, `OkHttp-Selected-Protocol`.
-
-##### Changes
-
- * New: Support for `HTTP-draft-09/2.0`.
- * New: Support for `spdy/3.1`. Dropped support for `spdy/3`.
- * New: Use ALPN on Android platforms that support it (4.4+)
- * New: CacheControl model and parser.
- * New: Protocol selection in MockWebServer.
- * Fix: Route selection shouldn't use TLS modes that we know will fail.
- * Fix: Cache SPDY responses even if the response body is closed prematurely.
- * Fix: Use strict timeouts when aborting a download.
- * Fix: Support Shoutcast HTTP responses like `ICY 200 OK`.
- * Fix: Don't unzip if there isn't a response body.
- * Fix: Don't leak gzip streams on redirects.
- * Fix: Don't do DNS lookups on invalid hosts.
- * Fix: Exhaust the underlying stream when reading gzip streams.
- * Fix: Support the `PATCH` method.
- * Fix: Support request bodies on `DELETE` method.
- * Fix: Drop the `okhttp-protocols` module.
- * Internal: Replaced internal byte array buffers with pooled buffers ("OkBuffer").
-
-
-## Version 1.3.0
-
-_2014-01-11_
-
- * New: Support for "PATCH" HTTP method in client and MockWebServer.
- * Fix: Drop `Content-Length` header when redirected from POST to GET.
- * Fix: Correctly read cached header entries with malformed header names.
- * Fix: Do not directly support any authentication schemes other than "Basic".
- * Fix: Respect read timeouts on recycled connections.
- * Fix: Transmit multiple cookie values as a single header with delimiter.
- * Fix: Ensure `null` is never returned from a connection's `getHeaderFields()`.
- * Fix: Persist proper `Content-Encoding` header to cache for GZip responses.
- * Fix: Eliminate rare race condition in SPDY streams that would prevent connection reuse.
- * Fix: Change HTTP date formats to UTC to conform to RFC2616 section 3.3.
- * Fix: Support SPDY header blocks with trailing bytes.
- * Fix: Allow `;` as separator for `Cache-Control` header.
- * Fix: Correct bug where HTTPS POST requests were always automatically buffered.
- * Fix: Honor read timeout when parsing SPDY headers.
-
-
-## Version 1.2.1
-
-_2013-08-23_
-
- * Resolve issue with 'jar-with-dependencies' artifact creation.
- * Fix: Support empty SPDY header values.
-
-
-## Version 1.2.0
-
-_2013-08-11_
-
- * New APIs on OkHttpClient to set default timeouts for connect and read.
- * Fix bug when caching SPDY responses.
- * Fix a bug with SPDY plus half-closed streams. (thanks kwuollett)
- * Fix a bug in `Content-Length` reporting for gzipped streams in the Apache
- HTTP client adapter. (thanks kwuollett)
- * Work around the Alcatel `getByInetAddress` bug (thanks k.kocel)
- * Be more aggressive about testing pooled sockets before reuse. (thanks
- warpspin)
- * Include `Content-Type` and `Content-Encoding` in the Apache HTTP client
- adapter. (thanks kwuollett)
- * Add a media type class to OkHttp.
- * Change custom header prefix:
-
- ```
- X-Android-Sent-Millis is now OkHttp-Sent-Millis
- X-Android-Received-Millis is now OkHttp-Received-Millis
- X-Android-Response-Source is now OkHttp-Response-Source
- X-Android-Selected-Transport is now OkHttp-Selected-Transport
- ```
- * Improve cache invalidation for POST-like requests.
- * Bring MockWebServer into OkHttp and teach it SPDY.
-
-
-## Version 1.1.1
-
-_2013-06-23_
-
- * Fix: ClassCastException when caching responses that were redirected from
- HTTP to HTTPS.
-
-
-## Version 1.1.0
-
-_2013-06-15_
-
- * Fix: Connection reuse was broken for most HTTPS connections due to a bug in
- the way the hostname verifier was selected.
- * Fix: Locking bug in SpdyConnection.
- * Fix: Ignore null header values (for compatibility with HttpURLConnection).
- * Add URLStreamHandlerFactory support so that `URL.openConnection()` uses
- OkHttp.
- * Expose the transport ("http/1.1", "spdy/3", etc.) via magic request headers.
- Use `X-Android-Transports` to write the preferred transports and
- `X-Android-Selected-Transport` to read the negotiated transport.
-
-
-## Version 1.0.2
-
-_2013-05-11_
-
- * Fix: Remove use of Java 6-only APIs.
- * Fix: Properly handle exceptions from `NetworkInterface` when querying MTU.
- * Fix: Ensure MTU has a reasonable default and upper-bound.
-
-
-## Version 1.0.1
-
-_2013-05-06_
-
- * Correct casing of SSL in method names (`getSslSocketFactory`/`setSslSocketFactory`).
-
-
-## Version 1.0.0
-
-_2013-05-06_
-
-Initial release.
-
- [brick]: https://noncombatant.org/2015/05/01/about-http-public-key-pinning/
- [webdav]: https://tools.ietf.org/html/rfc4918
- [major_versions]: https://jakewharton.com/java-interoperability-policy-for-major-version-updates/
- [nginx_959]: https://trac.nginx.org/nginx/ticket/959
- [okhttp_idling_resource]: https://github.com/JakeWharton/okhttp-idling-resource
- [bom]: https://en.wikipedia.org/wiki/Byte_order_mark
- [junit_5_rules]: https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-rulesupport
- [public_suffix]: https://publicsuffix.org/
- [maven_provided]: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
- [remove_cbc_ecdsa]: https://developers.google.com/web/updates/2016/12/chrome-56-deprecations#remove_cbc-mode_ecdsa_ciphers_in_tls
- [conscrypt]: https://github.com/google/conscrypt/
- [conscrypt_dependency]: https://github.com/google/conscrypt/#download
- [https_server_sample]: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/HttpsServer.java
- [require_android_5]: https://cashapp.github.io/2019-02-05/okhttp-3-13-requires-android-5
- [obsolete_apache_client]: https://gist.github.com/swankjesse/09721f72039e3a46cf50f94323deb82d
- [obsolete_url_factory]: https://gist.github.com/swankjesse/dd91c0a8854e1559b00f5fc9c7bfae70
- [tls_configuration_history]: https://square.github.io/okhttp/tls_configuration_history/
- [grpc_http2]: https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md
- [upgrading_to_okhttp_4]: https://square.github.io/okhttp/upgrading_to_okhttp_4/
- [interceptors]: https://square.github.io/okhttp/interceptors/
- [okhttp4_blog_post]: https://cashapp.github.io/2019-06-26/okhttp-4-goes-kotlin
[iana_websocket]: https://www.iana.org/assignments/websocket/websocket.txt
+ [okhttp4_blog_post]: https://cashapp.github.io/2019-06-26/okhttp-4-goes-kotlin
+ [upgrading_to_okhttp_4]: https://square.github.io/okhttp/upgrading_to_okhttp_4/
diff --git a/docs/changelog_1x.md b/docs/changelog_1x.md
new file mode 100644
index 000000000..fba6c701f
--- /dev/null
+++ b/docs/changelog_1x.md
@@ -0,0 +1,195 @@
+OkHttp 1.x Change Log
+=====================
+
+## Version 1.6.0
+
+_2014-05-23_
+
+ * Offer bridges to make it easier to migrate from OkHttp 1.x to OkHttp 2.0.
+ This adds `OkUrlFactory`, `Cache`, and `@Deprecated` annotations for APIs
+ dropped in 2.0.
+
+## Version 1.5.4
+
+_2014-04-14_
+
+ * Drop ALPN support in Android. There's a concurrency bug in all
+ currently-shipping versions.
+ * Support asynchronous disconnects by breaking the socket only. This should
+ prevent flakiness from multiple threads concurrently accessing a stream.
+
+## Version 1.5.3
+
+_2014-03-29_
+
+ * Fix bug where the Content-Length header was not always dropped when
+ following a redirect from a POST to a GET.
+ * Implement basic support for `Thread.interrupt()`. OkHttp now checks
+ for an interruption before doing a blocking call. If it is interrupted,
+ it throws an `InterruptedIOException`.
+
+## Version 1.5.2
+
+_2014-03-17_
+
+ * Fix bug where deleting a file that was absent from the `HttpResponseCache`
+ caused an IOException.
+ * Fix bug in HTTP/2 where our HPACK decoder wasn't emitting entries in
+ certain eviction scenarios, leading to dropped response headers.
+
+## Version 1.5.1
+
+_2014-03-11_
+
+ * Fix 1.5.0 regression where connections should not have been recycled.
+ * Fix 1.5.0 regression where transparent Gzip was broken by attempting to
+ recover from another I/O failure.
+ * Fix problems where spdy/3.1 headers may not have been compressed properly.
+ * Fix problems with spdy/3.1 and http/2 where the wrong window size was being
+ used.
+ * Fix 1.5.0 regression where conditional cache responses could corrupt the
+ connection pool.
+
+
+## Version 1.5.0
+
+_2014-03-07_
+
+
+##### OkHttp no longer uses the default SSL context.
+
+Applications that want to use the global SSL context with OkHttp should configure their
+OkHttpClient instances with the following:
+
+```java
+okHttpClient.setSslSocketFactory(HttpsURLConnection.getDefaultSSLSocketFactory());
+```
+
+A simpler solution is to avoid the shared default SSL socket factory. Instead, if you
+need to customize SSL, do so for your specific OkHttpClient instance only.
+
+##### Synthetic headers have changed
+
+Previously OkHttp added a synthetic response header, `OkHttp-Selected-Transport`. It
+has been replaced with a new synthetic header, `OkHttp-Selected-Protocol`.
+
+##### Changes
+
+ * New: Support for `HTTP-draft-09/2.0`.
+ * New: Support for `spdy/3.1`. Dropped support for `spdy/3`.
+ * New: Use ALPN on Android platforms that support it (4.4+)
+ * New: CacheControl model and parser.
+ * New: Protocol selection in MockWebServer.
+ * Fix: Route selection shouldn't use TLS modes that we know will fail.
+ * Fix: Cache SPDY responses even if the response body is closed prematurely.
+ * Fix: Use strict timeouts when aborting a download.
+ * Fix: Support Shoutcast HTTP responses like `ICY 200 OK`.
+ * Fix: Don't unzip if there isn't a response body.
+ * Fix: Don't leak gzip streams on redirects.
+ * Fix: Don't do DNS lookups on invalid hosts.
+ * Fix: Exhaust the underlying stream when reading gzip streams.
+ * Fix: Support the `PATCH` method.
+ * Fix: Support request bodies on `DELETE` method.
+ * Fix: Drop the `okhttp-protocols` module.
+ * Internal: Replaced internal byte array buffers with pooled buffers ("OkBuffer").
+
+
+## Version 1.3.0
+
+_2014-01-11_
+
+ * New: Support for "PATCH" HTTP method in client and MockWebServer.
+ * Fix: Drop `Content-Length` header when redirected from POST to GET.
+ * Fix: Correctly read cached header entries with malformed header names.
+ * Fix: Do not directly support any authentication schemes other than "Basic".
+ * Fix: Respect read timeouts on recycled connections.
+ * Fix: Transmit multiple cookie values as a single header with delimiter.
+ * Fix: Ensure `null` is never returned from a connection's `getHeaderFields()`.
+ * Fix: Persist proper `Content-Encoding` header to cache for GZip responses.
+ * Fix: Eliminate rare race condition in SPDY streams that would prevent connection reuse.
+ * Fix: Change HTTP date formats to UTC to conform to RFC2616 section 3.3.
+ * Fix: Support SPDY header blocks with trailing bytes.
+ * Fix: Allow `;` as separator for `Cache-Control` header.
+ * Fix: Correct bug where HTTPS POST requests were always automatically buffered.
+ * Fix: Honor read timeout when parsing SPDY headers.
+
+
+## Version 1.2.1
+
+_2013-08-23_
+
+ * Resolve issue with 'jar-with-dependencies' artifact creation.
+ * Fix: Support empty SPDY header values.
+
+
+## Version 1.2.0
+
+_2013-08-11_
+
+ * New APIs on OkHttpClient to set default timeouts for connect and read.
+ * Fix bug when caching SPDY responses.
+ * Fix a bug with SPDY plus half-closed streams. (thanks kwuollett)
+ * Fix a bug in `Content-Length` reporting for gzipped streams in the Apache
+ HTTP client adapter. (thanks kwuollett)
+ * Work around the Alcatel `getByInetAddress` bug (thanks k.kocel)
+ * Be more aggressive about testing pooled sockets before reuse. (thanks
+ warpspin)
+ * Include `Content-Type` and `Content-Encoding` in the Apache HTTP client
+ adapter. (thanks kwuollett)
+ * Add a media type class to OkHttp.
+ * Change custom header prefix:
+
+ ```
+ X-Android-Sent-Millis is now OkHttp-Sent-Millis
+ X-Android-Received-Millis is now OkHttp-Received-Millis
+ X-Android-Response-Source is now OkHttp-Response-Source
+ X-Android-Selected-Transport is now OkHttp-Selected-Transport
+ ```
+ * Improve cache invalidation for POST-like requests.
+ * Bring MockWebServer into OkHttp and teach it SPDY.
+
+
+## Version 1.1.1
+
+_2013-06-23_
+
+ * Fix: ClassCastException when caching responses that were redirected from
+ HTTP to HTTPS.
+
+
+## Version 1.1.0
+
+_2013-06-15_
+
+ * Fix: Connection reuse was broken for most HTTPS connections due to a bug in
+ the way the hostname verifier was selected.
+ * Fix: Locking bug in SpdyConnection.
+ * Fix: Ignore null header values (for compatibility with HttpURLConnection).
+ * Add URLStreamHandlerFactory support so that `URL.openConnection()` uses
+ OkHttp.
+ * Expose the transport ("http/1.1", "spdy/3", etc.) via magic request headers.
+ Use `X-Android-Transports` to write the preferred transports and
+ `X-Android-Selected-Transport` to read the negotiated transport.
+
+
+## Version 1.0.2
+
+_2013-05-11_
+
+ * Fix: Remove use of Java 6-only APIs.
+ * Fix: Properly handle exceptions from `NetworkInterface` when querying MTU.
+ * Fix: Ensure MTU has a reasonable default and upper-bound.
+
+
+## Version 1.0.1
+
+_2013-05-06_
+
+ * Correct casing of SSL in method names (`getSslSocketFactory`/`setSslSocketFactory`).
+
+
+## Version 1.0.0
+
+_2013-05-06_
+
+Initial release.
diff --git a/docs/changelog_2x.md b/docs/changelog_2x.md
new file mode 100644
index 000000000..b64593efa
--- /dev/null
+++ b/docs/changelog_2x.md
@@ -0,0 +1,630 @@
+OkHttp 2.x Change Log
+=====================
+
+## Version 2.7.5
+
+_2016-02-25_
+
+ * Fix: Change the certificate pinner to always build full chains. This
+ prevents a potential crash when using certificate pinning with the Google
+ Play Services security provider.
+
+
+## Version 2.7.4
+
+_2016-02-07_
+
+ * Fix: Don't crash when finding the trust manager if the Play Services (GMS)
+ security provider is installed.
+ * Fix: The previous release introduced a performance regression on Android,
+ caused by looking up CA certificates. This is now fixed.
+
+
+## Version 2.7.3
+
+_2016-02-06_
+
+ * Fix: Permit the trusted CA root to be pinned by `CertificatePinner`.
+
+
+## Version 2.7.2
+
+_2016-01-07_
+
+ * Fix: Don't eagerly release stream allocations on cache hits. We might still
+ need them to handle redirects.
+
+
+## Version 2.7.1
+
+_2016-01-01_
+
+ * Fix: Don't do a health check on newly-created connections. This is
+ unnecessary work that could put the client in an inconsistent state if the
+ health check fails.
+
+
+## Version 2.7.0
+
+_2015-12-13_
+
+ * **Rewritten connection management.** Previously OkHttp's connection pool
+ managed both idle and active connections for HTTP/2, but only idle
+ connections for HTTP/1.x. With this update the connection pool manages both
+ idle and active connections for everything. OkHttp now detects and warns on
+ connections that were allocated but never released, and will enforce HTTP/2
+ stream limits. This update also fixes `Call.cancel()` to not do I/O on the
+ calling thread.
+ * Fix: Don't log gzipped data in the logging interceptor.
+ * Fix: Don't resolve DNS addresses when connecting through a SOCKS proxy.
+ * Fix: Drop the synthetic `OkHttp-Selected-Protocol` response header.
+ * Fix: Support 204 and 205 'No Content' replies in the logging interceptor.
+ * New: Add `Call.isExecuted()`.
+
+
+## Version 2.6.0
+
+_2015-11-22_
+
+ * **New Logging Interceptor.** The `logging-interceptor` subproject offers
+ simple request and response logging. It may be configured to log headers and
+ bodies for debugging. It requires this Maven dependency:
+
+ ```xml
+
+ com.squareup.okhttp
+ logging-interceptor
+ 2.6.0
+
+ ```
+
+ Configure basic logging like this:
+
+ ```java
+ HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
+ loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
+ client.networkInterceptors().add(loggingInterceptor);
+ ```
+
+ **Warning:** Avoid `Level.HEADERS` and `Level.BODY` in production because
+ they could leak passwords and other authentication credentials to insecure
+ logs.
+
+ * **WebSocket API now uses `RequestBody` and `ResponseBody` for messages.**
+ This is a backwards-incompatible API change.
+
+ * **The DNS service is now pluggable.** In some situations this may be useful
+ to manually prioritize specific IP addresses.
+
+ * Fix: Don't throw when converting an `HttpUrl` to a `java.net.URI`.
+ Previously URLs with special characters like `|` and `[` would break when
+ subjected to URI’s overly-strict validation.
+ * Fix: Don't re-encode `+` as `%20` in encoded URL query strings. OkHttp
+ prefers `%20` when doing its own encoding, but will retain `+` when that is
+ provided.
+ * Fix: Enforce that callers call `WebSocket.close()` on IO errors. Error
+ handling in WebSockets is significantly improved.
+ * Fix: Don't use SPDY/3 style header concatenation for HTTP/2 request headers.
+ This could have corrupted requests where multiple headers had the same name,
+ as in cookies.
+ * Fix: Reject bad characters in the URL hostname. Previously characters like
+ `\0` would cause a late crash when building the request.
+ * Fix: Allow interceptors to change the request method.
+ * Fix: Don’t use the request's `User-Agent` or `Proxy-Authorization` when
+ connecting to an HTTPS server via an HTTP tunnel. The `Proxy-Authorization`
+ header was being leaked to the origin server.
+ * Fix: Digits may be used in a URL scheme.
+ * Fix: Improve connection timeout recovery.
+ * Fix: Recover from `getsockname` crashes impacting Android releases prior to
+ 4.2.2.
+ * Fix: Drop partial support for HTTP/1.0. Previously OkHttp would send
+ `HTTP/1.0` on connections after seeing a response with `HTTP/1.0`. The fixed
+ behavior is consistent with Firefox and Chrome.
+ * Fix: Allow a body in `OPTIONS` requests.
+ * Fix: Don't percent-encode non-ASCII characters in URL fragments.
+ * Fix: Handle null fragments.
+ * Fix: Don’t crash on interceptors that throw `IOException` before a
+ connection is attempted.
+ * New: Support [WebDAV][webdav] HTTP methods.
+ * New: Buffer WebSocket frames for better performance.
+ * New: Drop support for `TLS_DHE_DSS_WITH_AES_128_CBC_SHA`, our only remaining
+ DSS cipher suite. This is consistent with Firefox and Chrome which have also
+ dropped these cipher suite.
+
+## Version 2.5.0
+
+_2015-08-25_
+
+ * **Timeouts now default to 10 seconds.** Previously we defaulted to never
+ timing out, and that was a lousy policy. If establishing a connection,
+ reading the next byte from a connection, or writing the next byte to a
+ connection takes more than 10 seconds to complete, you’ll need to adjust
+ the timeouts manually.
+
+ * **OkHttp now rejects request headers that contain invalid characters.** This
+ includes potential security problems (newline characters) as well as simple
+ non-ASCII characters (including international characters and emoji).
+
+ * **Call canceling is more reliable.** We had a bug where a socket being
+ connected wasn't being closed when the application used `Call.cancel()`.
+
+ * **Changing a HttpUrl’s scheme now tracks the default port.** We had a bug
+ where changing a URL from `http` to `https` would leave it on port 80.
+
+ * **Okio has been updated to 1.6.0.**
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.6.0
+
+ ```
+
+ * New: `Cache.initialize()`. Call this on a background thread to eagerly
+ initialize the response cache.
+ * New: Fold `MockWebServerRule` into `MockWebServer`. This makes it easier to
+ write JUnit tests with `MockWebServer`. The `MockWebServer` library now
+ depends on JUnit, though it continues to work with all testing frameworks.
+ * Fix: `FormEncodingBuilder` is now consistent with browsers in which
+ characters it escapes. Previously we weren’t percent-encoding commas,
+ parens, and other characters.
+ * Fix: Relax `FormEncodingBuilder` to support building empty forms.
+ * Fix: Timeouts throw `SocketTimeoutException`, not `InterruptedIOException`.
+ * Fix: Change `MockWebServer` to use the same logic as OkHttp when determining
+ whether an HTTP request permits a body.
+ * Fix: `HttpUrl` now uses the canonical form for IPv6 addresses.
+ * Fix: Use `HttpUrl` internally.
+ * Fix: Recover from Android 4.2.2 EBADF crashes.
+ * Fix: Don't crash with an `IllegalStateException` if an HTTP/2 or SPDY
+ write fails, leaving the connection in an inconsistent state.
+ * Fix: Make sure the default user agent is ASCII.
+
+
+## Version 2.4.0
+
+_2015-05-22_
+
+ * **Forbid response bodies on HTTP 204 and 205 responses.** Webservers that
+ return such malformed responses will now trigger a `ProtocolException` in
+ the client.
+
+ * **WebSocketListener has incompatible changes.** The `onOpen()` method is now
+ called on the reader thread, so implementations must return before further
+ websocket messages will be delivered. The `onFailure()` method now includes
+ an HTTP response if one was returned.
+
+## Version 2.4.0-RC1
+
+_2015-05-16_
+
+ * **New HttpUrl API.** It's like `java.net.URL` but good. Note that
+ `Request.Builder.url()` now throws `IllegalArgumentException` on malformed
+ URLs. (Previous releases would throw a `MalformedURLException` when calling
+ a malformed URL.)
+
+ * **We've improved connect failure recovery.** We now differentiate between
+ setup, connecting, and connected and implement appropriate recovery rules
+ for each. This changes `Address` to no longer use `ConnectionSpec`. (This is
+ an incompatible API change).
+
+ * **`FormEncodingBuilder` now uses `%20` instead of `+` for encoded spaces.**
+ Both are permitted-by-spec, but `%20` requires fewer special cases.
+
+ * **Okio has been updated to 1.4.0.**
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.4.0
+
+ ```
+
+ * **`Request.Builder` no longer accepts null if a request body is required.**
+ Passing null will now fail for request methods that require a body. Instead
+ use an empty body such as this one:
+
+ ```java
+ RequestBody.create(null, new byte[0]);
+ ```
+
+ * **`CertificatePinner` now supports wildcard hostnames.** As always with
+ certificate pinning, you must be very careful to avoid [bricking][brick]
+ your app. You'll need to pin both the top-level domain and the `*.` domain
+ for full coverage.
+
+ ```java
+ client.setCertificatePinner(new CertificatePinner.Builder()
+ .add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
+ .add("*.publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=")
+ .add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
+ .add("*.publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=")
+ .add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
+ .add("*.publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=")
+ .add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
+ .add("*.publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=")
+ .build());
+ ```
+
+ * **Interceptors lists are now deep-copied by `OkHttpClient.clone()`.**
+ Previously clones shared interceptors, which made it difficult to customize
+ the interceptors on a request-by-request basis.
+
+ * New: `Headers.toMultimap()`.
+ * New: `RequestBody.create(MediaType, ByteString)`.
+ * New: `ConnectionSpec.isCompatible(SSLSocket)`.
+ * New: `Dispatcher.getQueuedCallCount()` and
+ `Dispatcher.getRunningCallCount()`. These can be useful in diagnostics.
+ * Fix: OkHttp no longer shares timeouts between pooled connections. This was
+ causing some applications to crash when connections were reused.
+ * Fix: `OkApacheClient` now allows an empty `PUT` and `POST`.
+ * Fix: Websockets no longer rebuffer socket streams.
+ * Fix: Websockets are now better at handling close frames.
+ * Fix: Content type matching is now case insensitive.
+ * Fix: `Vary` headers are not lost with `android.net.http.HttpResponseCache`.
+ * Fix: HTTP/2 wasn't enforcing stream timeouts when writing the underlying
+ connection. Now it is.
+ * Fix: Never return null on `call.proceed()`. This was a bug in call
+ cancelation.
+ * Fix: When a network interceptor mutates a request, that change is now
+ reflected in `Response.networkResponse()`.
+ * Fix: Badly-behaving caches now throw a checked exception instead of a
+ `NullPointerException`.
+ * Fix: Better handling of uncaught exceptions in MockWebServer with HTTP/2.
+
+## Version 2.3.0
+
+_2015-03-16_
+
+ * **HTTP/2 support.** We've done interop testing and haven't seen any
+ problems. HTTP/2 support has been a big effort and we're particularly
+ thankful to Adrian Cole who has helped us to reach this milestone.
+
+ * **RC4 cipher suites are no longer supported by default.** To connect to
+ old, obsolete servers relying on these cipher suites, you must create a
+ custom `ConnectionSpec`.
+
+ * **Beta WebSockets support.**. The `okhttp-ws` subproject offers a new
+ websockets client. Please try it out! When it's ready we intend to include
+ it with the core OkHttp library.
+
+ * **Okio updated to 1.3.0.**
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.3.0
+
+ ```
+
+ * **Fix: improve parallelism of async requests.** OkHttp's Dispatcher had a
+ misconfigured `ExecutorService` that limited the number of worker threads.
+ If you're using `Call.enqueue()` this update should significantly improve
+ request concurrency.
+
+ * **Fix: Lazily initialize the response cache.** This avoids strict mode
+ warnings when initializing OkHttp on Android‘s main thread.
+
+ * **Fix: Disable ALPN on Android 4.4.** That release of the feature was
+ unstable and prone to native crashes in the underlying OpenSSL code.
+ * Fix: Don't send both `If-None-Match` and `If-Modified-Since` cache headers
+ when both are applicable.
+ * Fix: Fail early when a port is out of range.
+ * Fix: Offer `Content-Length` headers for multipart request bodies.
+ * Fix: Throw `UnknownServiceException` if a cleartext connection is attempted
+ when explicitly forbidden.
+ * Fix: Throw a `SSLPeerUnverifiedException` when host verification fails.
+ * Fix: MockWebServer explicitly closes sockets. (On some Android releases,
+ closing the input stream and output stream of a socket is not sufficient.
+ * Fix: Buffer outgoing HTTP/2 frames to limit how many outgoing frames are
+ created.
+ * Fix: Avoid crashing when cache writing fails due to a full disk.
+ * Fix: Improve caching of private responses.
+ * Fix: Update cache-by-default response codes.
+ * Fix: Reused `Request.Builder` instances no longer hold stale URL fields.
+ * New: ConnectionSpec can now be configured to use the SSL socket's default
+ cipher suites. To use, set the cipher suites to `null`.
+ * New: Support `DELETE` with a request body.
+ * New: `Headers.of(Map)` creates headers from a Map.
+
+
+## Version 2.2.0
+
+_2014-12-30_
+
+ * **`RequestBody.contentLength()` now throws `IOException`.**
+ This is a source-incompatible change. If you have code that calls
+ `RequestBody.contentLength()`, your compile will break with this
+ update. The change is binary-compatible, however: code compiled
+ for OkHttp 2.0 and 2.1 will continue to work with this update.
+
+ * **`COMPATIBLE_TLS` no longer supports SSLv3.** In response to the
+ [POODLE](https://googleonlinesecurity.blogspot.ca/2014/10/this-poodle-bites-exploiting-ssl-30.html)
+ vulnerability, OkHttp no longer offers SSLv3 when negotiation an
+ HTTPS connection. If you continue to need to connect to webservers
+ running SSLv3, you must manually configure your own `ConnectionSpec`.
+
+ * **OkHttp now offers interceptors.** Interceptors are a powerful mechanism
+ that can monitor, rewrite, and retry calls. The [interceptors doc][interceptors] is a full
+ introduction to this new API.
+
+ * New: APIs to iterate and selectively clear the response cache.
+ * New: Support for SOCKS proxies.
+ * New: Support for `TLS_FALLBACK_SCSV`.
+ * New: Update HTTP/2 support to `h2-16` and `hpack-10`.
+ * New: APIs to prevent retrying non-idempotent requests.
+ * Fix: Drop NPN support. Going forward we support ALPN only.
+ * Fix: The hostname verifier is now strict. This is consistent with the hostname
+ verifier in modern browsers.
+ * Fix: Improve `CONNECT` handling for misbehaving HTTP proxies.
+ * Fix: Don't retry requests that failed due to timeouts.
+ * Fix: Cache 302s and 308s that include appropriate response headers.
+ * Fix: Improve pooling of connections that use proxy selectors.
+ * Fix: Don't leak connections when using ALPN on the desktop.
+ * Fix: Update Jetty ALPN to `7.1.2.v20141202` (Java 7) and `8.1.2.v20141202` (Java 8).
+ This fixes a bug in resumed TLS sessions where the wrong protocol could be
+ selected.
+ * Fix: Don't crash in SPDY and HTTP/2 when disconnecting before connecting.
+ * Fix: Avoid a reverse DNS-lookup for a numeric proxy address
+ * Fix: Resurrect http/2 frame logging.
+ * Fix: Limit to 20 authorization attempts.
+
+## Version 2.1.0
+
+_2014-11-11_
+
+ * New: Typesafe APIs for interacting with cipher suites and TLS versions.
+ * Fix: Don't crash when mixing authorization challenges with upload retries.
+
+
+## Version 2.1.0-RC1
+
+_2014-11-04_
+
+ * **OkHttp now caches private responses**. We've changed from a shared cache
+ to a private cache, and will now store responses that use an `Authorization`
+ header. This means OkHttp's cache shouldn't be used on middleboxes that sit
+ between user agents and the origin server.
+
+ * **TLS configuration updated.** OkHttp now explicitly enables TLSv1.2,
+ TLSv1.1 and TLSv1.0 where they are supported. It will continue to perform
+ only one fallback, to SSLv3. Applications can now configure this with the
+ `ConnectionSpec` class.
+
+ To disable TLS fallback:
+
+ ```java
+ client.setConnectionSpecs(Arrays.asList(
+ ConnectionSpec.MODERN_TLS, ConnectionSpec.CLEARTEXT));
+ ```
+
+ To disable cleartext connections, permitting `https` URLs only:
+
+ ```java
+ client.setConnectionSpecs(Arrays.asList(
+ ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS));
+ ```
+
+ * **New cipher suites.** Please confirm that your webservers are reachable
+ with this limited set of cipher suites.
+
+ ```
+ Android
+ Name Version
+
+ TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 5.0
+ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 5.0
+ TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 5.0
+ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 4.0
+ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 4.0
+ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 4.0
+ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 4.0
+ TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 4.0
+ TLS_ECDHE_RSA_WITH_RC4_128_SHA 4.0
+ TLS_DHE_RSA_WITH_AES_128_CBC_SHA 2.3
+ TLS_DHE_DSS_WITH_AES_128_CBC_SHA 2.3
+ TLS_DHE_RSA_WITH_AES_256_CBC_SHA 2.3
+ TLS_RSA_WITH_AES_128_GCM_SHA256 5.0
+ TLS_RSA_WITH_AES_128_CBC_SHA 2.3
+ TLS_RSA_WITH_AES_256_CBC_SHA 2.3
+ SSL_RSA_WITH_3DES_EDE_CBC_SHA 2.3 (Deprecated in 5.0)
+ SSL_RSA_WITH_RC4_128_SHA 2.3
+ SSL_RSA_WITH_RC4_128_MD5 2.3 (Deprecated in 5.0)
+ ```
+
+ * **Okio updated to 1.0.1.**
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.0.1
+
+ ```
+
+ * **New APIs to permit easy certificate pinning.** Be warned, certificate
+ pinning is dangerous and could prevent your application from trusting your
+ server!
+
+ * **Cache improvements.** This release fixes some severe cache problems
+ including a bug where the cache could be corrupted upon certain access
+ patterns. We also fixed a bug where the cache was being cleared due to a
+ corrupted journal. We've added APIs to configure a request's `Cache-Control`
+ headers, and to manually clear the cache.
+
+ * **Request cancellation fixes.** This update fixes a bug where synchronous
+ requests couldn't be canceled by tag. This update avoids crashing when
+ `onResponse()` throws an `IOException`. That failure will now be logged
+ instead of notifying the thread's uncaught exception handler. We've added a
+ new API, `Call.isCanceled()` to check if a call has been canceled.
+
+ * New: Update `MultipartBuilder` to support content length.
+ * New: Make it possible to mock `OkHttpClient` and `Call`.
+ * New: Update to h2-14 and hpack-9.
+ * New: OkHttp includes a user-agent by default, like `okhttp/2.1.0-RC1`.
+ * Fix: Handle response code `308 Permanent Redirect`.
+ * Fix: Don't skip the callback if a call is canceled.
+ * Fix: Permit hostnames with underscores.
+ * Fix: Permit overriding the content-type in `OkApacheClient`.
+ * Fix: Use the socket factory for direct connections.
+ * Fix: Honor `OkUrlFactory` APIs that disable redirects.
+ * Fix: Don't crash on concurrent modification of `SPDY` SPDY settings.
+
+## Version 2.0.0
+
+This release commits to a stable 2.0 API. Read the 2.0.0-RC1 changes for advice
+on upgrading from 1.x to 2.x.
+
+_2014-06-21_
+
+ * **API Change**: Use `IOException` in `Callback.onFailure()`. This is
+ a source-incompatible change, and is different from OkHttp 2.0.0-RC2 which
+ used `Throwable`.
+ * Fix: Fixed a caching bug where we weren't storing rewritten request headers
+ like `Accept-Encoding`.
+ * Fix: Fixed bugs in handling the SPDY window size. This was stalling certain
+ large downloads
+ * Update the language level to Java 7. (OkHttp requires Android 2.3+ or Java 7+.)
+
+## Version 2.0.0-RC2
+
+_2014-06-11_
+
+This update fixes problems in 2.0.0-RC1. Read the 2.0.0-RC1 changes for
+advice on upgrading from 1.x to 2.x.
+
+ * Fix: Don't leak connections! There was a regression in 2.0.0-RC1 where
+ connections were neither closed nor pooled.
+ * Fix: Revert builder-style return types from OkHttpClient's timeout methods
+ for binary compatibility with OkHttp 1.x.
+ * Fix: Don't skip client stream 1 on SPDY/3.1. This fixes SPDY connectivity to
+ `https://google.com`, which doesn't follow the SPDY/3.1 spec!
+ * Fix: Always configure NPN headers. This fixes connectivity to
+ `https://facebook.com` when SPDY and HTTP/2 are both disabled. Otherwise an
+ unexpected NPN response is received and OkHttp crashes.
+ * Fix: Write continuation frames when HPACK data is larger than 16383 bytes.
+ * Fix: Don't drop uncaught exceptions thrown in async calls.
+ * Fix: Throw an exception eagerly when a request body is not legal. Previously
+ we ignored the problem at request-building time, only to crash later with a
+ `NullPointerException`.
+ * Fix: Include a backwards-compatible `OkHttp-Response-Source` header with
+ `OkUrlFactory `responses.
+ * Fix: Don't include a default User-Agent header in requests made with the Call
+ API. Requests made with OkUrlFactory will continue to have a default user
+ agent.
+ * New: Guava-like API to create headers:
+
+ ```java
+ Headers headers = Headers.of(name1, value1, name2, value2, ...).
+ ```
+
+ * New: Make the content-type header optional for request bodies.
+ * New: `Response.isSuccessful()` is a convenient API to check response codes.
+ * New: The response body can now be read outside of the callback. Response
+ bodies must always be closed, otherwise they will leak connections!
+ * New: APIs to create multipart request bodies (`MultipartBuilder`) and form
+ encoding bodies (`FormEncodingBuilder`).
+
+## Version 2.0.0-RC1
+
+_2014-05-23_
+
+OkHttp 2 is designed around a new API that is true to HTTP, with classes for
+requests, responses, headers, and calls. It uses modern Java patterns like
+immutability and chained builders. The API now offers asynchronous callbacks
+in addition to synchronous blocking calls.
+
+#### API Changes
+
+ * **New Request and Response types,** each with their own builder. There's also
+ a `RequestBody` class to write the request body to the network and a
+ `ResponseBody` to read the response body from the network. The standalone
+ `Headers` class offers full access to the HTTP headers.
+
+ * **Okio dependency added.** OkHttp now depends on
+ [Okio](https://github.com/square/okio), an I/O library that makes it easier
+ to access, store and process data. Using this library internally makes OkHttp
+ faster while consuming less memory. You can write a `RequestBody` as an Okio
+ `BufferedSink` and a `ResponseBody` as an Okio `BufferedSource`. Standard
+ `InputStream` and `OutputStream` access is also available.
+
+ * **New Call and Callback types** execute requests and receive their
+ responses. Both types of calls can be canceled via the `Call` or the
+ `OkHttpClient`.
+
+ * **URLConnection support has moved to the okhttp-urlconnection module.**
+ If you're upgrading from 1.x, this change will impact you. You will need to
+ add the `okhttp-urlconnection` module to your project and use the
+ `OkUrlFactory` to create new instances of `HttpURLConnection`:
+
+ ```java
+ // OkHttp 1.x:
+ HttpURLConnection connection = client.open(url);
+
+ // OkHttp 2.x:
+ HttpURLConnection connection = new OkUrlFactory(client).open(url);
+ ```
+
+ * **Custom caches are no longer supported.** In OkHttp 1.x it was possible to
+ define your own response cache with the `java.net.ResponseCache` and OkHttp's
+ `OkResponseCache` interfaces. Both of these APIs have been dropped. In
+ OkHttp 2 the built-in disk cache is the only supported response cache.
+
+ * **HttpResponseCache has been renamed to Cache.** Install it with
+ `OkHttpClient.setCache(...)` instead of `OkHttpClient.setResponseCache(...)`.
+
+ * **OkAuthenticator has been replaced with Authenticator.** This new
+ authenticator has access to the full incoming response and can respond with
+ whichever followup request is appropriate. The `Challenge` class is now a
+ top-level class and `Credential` is replaced with a utility class called
+ `Credentials`.
+
+ * **OkHttpClient.getFollowProtocolRedirects() renamed to
+ getFollowSslRedirects()**. We reserve the word _protocol_ for the HTTP
+ version being used (HTTP/1.1, HTTP/2). The old name of this method was
+ misleading; it was always used to configure redirects between `https://` and
+ `http://` schemes.
+
+ * **RouteDatabase is no longer public API.** OkHttp continues to track which
+ routes have failed but this is no exposed in the API.
+
+ * **ResponseSource is gone.** This enum exposed whether a response came from
+ the cache, network, or both. OkHttp 2 offers more detail with raw access to
+ the cache and network responses in the new `Response` class.
+
+ * **TunnelRequest is gone.** It specified how to connect to an HTTP proxy.
+ OkHttp 2 uses the new `Request` class for this.
+
+ * **Dispatcher** is a new class that manages the queue of asynchronous calls. It
+ implements limits on total in-flight calls and in-flight calls per host.
+
+#### Implementation changes
+
+ * Support Android `TrafficStats` socket tagging.
+ * Drop authentication headers on redirect.
+ * Added support for compressed data frames.
+ * Process push promise callbacks in order.
+ * Update to http/2 draft 12.
+ * Update to HPACK draft 07.
+ * Add ALPN support. Maven will use ALPN on OpenJDK 8.
+ * Update NPN dependency to target `jdk7u60-b13` and `Oracle jdk7u55-b13`.
+ * Ensure SPDY variants support zero-length DELETE and POST.
+ * Prevent leaking a cache item's InputStreams when metadata read fails.
+ * Use a string to identify TLS versions in routes.
+ * Add frame logger for HTTP/2.
+ * Replacing `httpMinorVersion` with `Protocol`. Expose HTTP/1.0 as a potential protocol.
+ * Use `Protocol` to describe framing.
+ * Implement write timeouts for HTTP/1.1 streams.
+ * Avoid use of SPDY stream ID 1, as that's typically used for UPGRADE.
+ * Support OAuth in `Authenticator`.
+ * Permit a dangling semicolon in media type parsing.
+
+
+## Version 1.x
+
+[Change log](changelog_1x.md)
+
+
+ [brick]: https://noncombatant.org/2015/05/01/about-http-public-key-pinning/
+ [interceptors]: https://square.github.io/okhttp/interceptors/
+ [webdav]: https://tools.ietf.org/html/rfc4918
diff --git a/docs/changelog_3x.md b/docs/changelog_3x.md
new file mode 100644
index 000000000..65897b292
--- /dev/null
+++ b/docs/changelog_3x.md
@@ -0,0 +1,974 @@
+OkHttp 3.x Change Log
+=====================
+
+## Version 3.14.2
+
+_2019-05-19_
+
+ * Fix: Lock in a route when recovering from an HTTP/2 connection error. We had a bug where two
+ calls that failed at the same time could cause OkHttp to crash with a `NoSuchElementException`
+ instead of the expected `IOException`.
+
+ * Fix: Don't crash with a `NullPointerException` when formatting an error message describing a
+ truncated response from an HTTPS proxy.
+
+
+## Version 3.14.1
+
+_2019-04-10_
+
+ * Fix: Don't crash when an interceptor retries when there are no more routes. This was an
+ edge-case regression introduced with the events cleanup in 3.14.0.
+
+ * Fix: Provide actionable advice when the exchange is non-null. Prior to 3.14, OkHttp would
+ silently leak connections when an interceptor retries without closing the response body. With
+ 3.14 we detect this problem but the exception was not helpful.
+
+## Version 3.14.0
+
+_2019-03-14_
+
+ * **This release deletes the long-deprecated `OkUrlFactory` and `OkApacheClient` APIs.** These
+ facades hide OkHttp's implementation behind another client's API. If you still need this please
+ copy and paste [ObsoleteUrlFactory.java][obsolete_url_factory] or
+ [ObsoleteApacheClient.java][obsolete_apache_client] into your project.
+
+ * **OkHttp now supports duplex calls over HTTP/2.** With normal HTTP calls the request must finish
+ before the response starts. With duplex, request and response bodies are transmitted
+ simultaneously. This can be used to implement interactive conversations within a single HTTP
+ call.
+
+ Create duplex calls by overriding the new `RequestBody.isDuplex()` method to return true.
+ This simple option dramatically changes the behavior of the request body and of the entire
+ call.
+
+ The `RequestBody.writeTo()` method may now retain a reference to the provided sink and
+ hand it off to another thread to write to it after `writeTo` returns.
+
+ The `EventListener` may now see requests and responses interleaved in ways not previously
+ permitted. For example, a listener may receive `responseHeadersStart()` followed by
+ `requestBodyEnd()`, both on the same call. Such events may be triggered by different threads
+ even for a single call.
+
+ Interceptors that rewrite or replace the request body may now inadvertently interfere with
+ duplex request bodies. Such interceptors should check `RequestBody.isDuplex()` and avoid
+ accessing the request body when it is.
+
+ Duplex calls require HTTP/2. If HTTP/1 is established instead the duplex call will fail. The
+ most common use of duplex calls is [gRPC][grpc_http2].
+
+ * New: Prevent OkHttp from retransmitting a request body by overriding `RequestBody.isOneShot()`.
+ This is most useful when writing the request body is destructive.
+
+ * New: We've added `requestFailed()` and `responseFailed()` methods to `EventListener`. These
+ are called instead of `requestBodyEnd()` and `responseBodyEnd()` in some failure situations.
+ They may also be fired in cases where no event was published previously. In this release we did
+ an internal rewrite of our event code to fix problems where events were lost or unbalanced.
+
+ * Fix: Don't leak a connection when a call is canceled immediately preceding the `onFailure()`
+ callback.
+
+ * Fix: Apply call timeouts when connecting duplex calls, web sockets, and server-sent events.
+ Once the streams are established no further timeout is enforced.
+
+ * Fix: Retain the `Route` when a connection is reused on a redirect or other follow-up. This was
+ causing some `Authenticator` calls to see a null route when non-null was expected.
+
+ * Fix: Use the correct key size in the name of `TLS_AES_128_CCM_8_SHA256` which is a TLS 1.3
+ cipher suite. We accidentally specified a key size of 256, preventing that cipher suite from
+ being selected for any TLS handshakes. We didn't notice because this cipher suite isn't
+ supported on Android, Java, or Conscrypt.
+
+ We removed this cipher suite and `TLS_AES_128_CCM_SHA256` from the restricted, modern, and
+ compatible sets of cipher suites. These two cipher suites aren't enabled by default in either
+ Firefox or Chrome.
+
+ See our [TLS Configuration History][tls_configuration_history] tracker for a log of all changes
+ to OkHttp's default TLS options.
+
+ * New: Upgrade to Conscrypt 2.0.0. OkHttp works with other versions of Conscrypt but this is the
+ version we're testing against.
+
+ ```kotlin
+ implementation("org.conscrypt:conscrypt-openjdk-uber:2.0.0")
+ ```
+
+ * New: Update the embedded public suffixes list.
+
+
+## Version 3.13.1
+
+_2019-02-05_
+
+ * Fix: Don't crash when using a custom `X509TrustManager` or `SSLSocket` on Android. When we
+ removed obsolete code for Android 4.4 we inadvertently also removed support for custom
+ subclasses. We've restored that support!
+
+
+## Version 3.13.0
+
+_2019-02-04_
+
+ * **This release bumps our minimum requirements to Java 8+ or Android 5+.** Cutting off old
+ devices is a serious change and we don't do it lightly! [This post][require_android_5] explains
+ why we're doing this and how to upgrade.
+
+ The OkHttp 3.12.x branch will be our long-term branch for Android 2.3+ (API level 9+) and Java
+ 7+. These platforms lack support for TLS 1.2 and should not be used. But because upgrading is
+ difficult we will backport critical fixes to the 3.12.x branch through December 31, 2020.
+
+ * **TLSv1 and TLSv1.1 are no longer enabled by default.** Major web browsers are working towards
+ removing these versions altogether in early 2020. If your servers aren't ready yet you can
+ configure OkHttp 3.13 to allow TLSv1 and TLSv1.1 connections:
+
+ ```
+ OkHttpClient client = new OkHttpClient.Builder()
+ .connectionSpecs(Arrays.asList(ConnectionSpec.COMPATIBLE_TLS))
+ .build();
+ ```
+
+ * New: You can now access HTTP trailers with `Response.trailers()`. This method may only be called
+ after the entire HTTP response body has been read.
+
+ * New: Upgrade to Okio 1.17.3. If you're on Kotlin-friendly Okio 2.x this release requires 2.2.2
+ or newer.
+
+ ```kotlin
+ implementation("com.squareup.okio:okio:1.17.3")
+ ```
+
+ * Fix: Don't miss cancels when sending HTTP/2 request headers.
+ * Fix: Don't miss whole operation timeouts when calls redirect.
+ * Fix: Don't leak connections if web sockets have malformed responses or if `onOpen()` throws.
+ * Fix: Don't retry when request bodies fail due to `FileNotFoundException`.
+ * Fix: Don't crash when URLs have IPv4-mapped IPv6 addresses.
+ * Fix: Don't crash when building `HandshakeCertificates` on Android API 28.
+ * Fix: Permit multipart file names to contain non-ASCII characters.
+ * New: API to get MockWebServer's dispatcher.
+ * New: API to access headers as `java.time.Instant`.
+ * New: Fail fast if a `SSLSocketFactory` is used as a `SocketFactory`.
+ * New: Log the TLS handshake in `LoggingEventListener`.
+
+
+## Version 3.12.3
+
+_2019-05-07_
+
+ * Fix: Permit multipart file names to contain non-ASCII characters.
+ * Fix: Retain the `Route` when a connection is reused on a redirect or other follow-up. This was
+ causing some `Authenticator` calls to see a null route when non-null was expected.
+
+
+## Version 3.12.2
+
+_2019-03-14_
+
+ * Fix: Don't crash if the HTTPS server returns no certificates in the TLS handshake.
+ * Fix: Don't leak a connection when a call is canceled immediately preceding the `onFailure()`
+ callback.
+
+
+## Version 3.12.1
+
+_2018-12-23_
+
+ * Fix: Remove overlapping `package-info.java`. This caused issues with some build tools.
+
+
+## Version 3.12.0
+
+_2018-11-16_
+
+ * **OkHttp now supports TLS 1.3.** This requires either Conscrypt or Java 11+.
+
+ * **Proxy authenticators are now asked for preemptive authentication.** OkHttp will now request
+ authentication credentials before creating TLS tunnels through HTTP proxies (HTTP `CONNECT`).
+ Authenticators should identify preemptive authentications by the presence of a challenge whose
+ scheme is "OkHttp-Preemptive".
+
+ * **OkHttp now offers full-operation timeouts.** This sets a limit on how long the entire call may
+ take and covers resolving DNS, connecting, writing the request body, server processing, and
+ reading the full response body. If a call requires redirects or retries all must complete within
+ one timeout period.
+
+ Use `OkHttpClient.Builder.callTimeout()` to specify the default duration and `Call.timeout()` to
+ specify the timeout of an individual call.
+
+ * New: Return values and fields are now non-null unless otherwise annotated.
+ * New: `LoggingEventListener` makes it easy to get basic visibility into a call's performance.
+ This class is in the `logging-interceptor` artifact.
+ * New: `Headers.Builder.addUnsafeNonAscii()` allows non-ASCII values to be added without an
+ immediate exception.
+ * New: Headers can be redacted in `HttpLoggingInterceptor`.
+ * New: `Headers.Builder` now accepts dates.
+ * New: OkHttp now accepts `java.time.Duration` for timeouts on Java 8+ and Android 26+.
+ * New: `Challenge` includes all authentication parameters.
+ * New: Upgrade to BouncyCastle 1.60, Conscrypt 1.4.0, and Okio 1.15.0. We don't yet require
+ Kotlin-friendly Okio 2.x but OkHttp works fine with that series.
+
+ ```kotlin
+ implementation("org.bouncycastle:bcprov-jdk15on:1.60")
+ implementation("org.conscrypt:conscrypt-openjdk-uber:1.4.0")
+ implementation("com.squareup.okio:okio:1.15.0")
+ ```
+
+ * Fix: Handle dispatcher executor shutdowns gracefully. When there aren't any threads to carry a
+ call its callback now gets a `RejectedExecutionException`.
+ * Fix: Don't permanently cache responses with `Cache-Control: immutable`. We misunderstood the
+ original `immutable` proposal!
+ * Fix: Change `Authenticator`'s `Route` parameter to be nullable. This was marked as non-null but
+ could be called with null in some cases.
+ * Fix: Don't create malformed URLs when `MockWebServer` is reached via an IPv6 address.
+ * Fix: Don't crash if the system default authenticator is null.
+ * Fix: Don't crash generating elliptic curve certificates on Android.
+ * Fix: Don't crash doing platform detection on RoboVM.
+ * Fix: Don't leak socket connections when web socket upgrades fail.
+
+
+## Version 3.11.0
+
+_2018-07-12_
+
+ * **OkHttp's new okhttp-tls submodule tames HTTPS and TLS.**
+
+ `HeldCertificate` is a TLS certificate and its private key. Generate a certificate with its
+ builder then use it to sign another certificate or perform a TLS handshake. The
+ `certificatePem()` method encodes the certificate in the familiar PEM format
+ (`--- BEGIN CERTIFICATE ---`); the `privateKeyPkcs8Pem()` does likewise for the private key.
+
+ `HandshakeCertificates` holds the TLS certificates required for a TLS handshake. On the server
+ it keeps your `HeldCertificate` and its chain. On the client it keeps the root certificates
+ that are trusted to sign a server's certificate chain. `HandshakeCertificates` also works with
+ mutual TLS where these roles are reversed.
+
+ These classes make it possible to enable HTTPS in MockWebServer in [just a few lines of
+ code][https_server_sample].
+
+ * **OkHttp now supports prior knowledge cleartext HTTP/2.** Enable this by setting
+ `Protocol.H2_PRIOR_KNOWLEDGE` as the lone protocol on an `OkHttpClient.Builder`. This mode
+ only supports `http:` URLs and is best suited in closed environments where HTTPS is
+ inappropriate.
+
+ * New: `HttpUrl.get(String)` is an alternative to `HttpUrl.parse(String)` that throws an exception
+ when the URL is malformed instead of returning null. Use this to avoid checking for null in
+ situations where the input is known to be well-formed. We've also added `MediaType.get(String)`
+ which is an exception-throwing alternative to `MediaType.parse(String)`.
+ * New: The `EventListener` API previewed in OkHttp 3.9 has graduated to a stable API. Use this
+ interface to track metrics and monitor HTTP requests' size and duration.
+ * New: `okhttp-dnsoverhttps` is an experimental API for doing DNS queries over HTTPS. Using HTTPS
+ for DNS offers better security and potentially better performance. This feature is a preview:
+ the API is subject to change.
+ * New: `okhttp-sse` is an early preview of Server-Sent Events (SSE). This feature is incomplete
+ and is only suitable for experimental use.
+ * New: MockWebServer now supports client authentication (mutual TLS). Call `requestClientAuth()`
+ to permit an optional client certificate or `requireClientAuth()` to require one.
+ * New: `RecordedRequest.getHandshake()` returns the HTTPS handshake of a request sent to
+ `MockWebServer`.
+ * Fix: Honor the `MockResponse` header delay in MockWebServer.
+ * Fix: Don't release HTTP/2 connections that have multiple canceled calls. We had a bug where
+ canceling calls would cause the shared HTTP/2 connection to be unnecessarily released. This
+ harmed connection reuse.
+ * Fix: Ensure canceled and discarded HTTP/2 data is not permanently counted against the limited
+ flow control window. We had a few bugs where window size accounting was broken when streams
+ were canceled or reset.
+ * Fix: Recover gracefully if the TLS session returns an unexpected version (`NONE`) or cipher
+ suite (`SSL_NULL_WITH_NULL_NULL`).
+ * Fix: Don't change Conscrypt configuration globally. We migrated from a process-wide setting to
+ configuring only OkHttp's TLS sockets.
+ * Fix: Prefer TLSv1.2 where it is available. On certain older platforms it is necessary to opt-in
+ to TLSv1.2.
+ * New: `Request.tag()` permits multiple tags. Use a `Class>` as a key to identify tags. Note
+ that `tag()` now returns null if the request has no tag. Previously this would return the
+ request itself.
+ * New: `Headers.Builder.addAll(Headers)`.
+ * New: `ResponseBody.create(MediaType, ByteString)`.
+ * New: Embed R8/ProGuard rules in the jar. These will be applied automatically by R8.
+ * Fix: Release the connection if `Authenticator` throws an exception.
+ * Fix: Change the declaration of `OkHttpClient.cache()` to return a `@Nullable Cache`. The return
+ value has always been nullable but it wasn't declared properly.
+ * Fix: Reverse suppression of connect exceptions. When both a call and its retry fail, we now
+ throw the initial exception which is most likely to be actionable.
+ * Fix: Retain interrupted state when throwing `InterruptedIOException`. A single interrupt should
+ now be sufficient to break out an in-flight OkHttp call.
+ * Fix: Don't drop a call to `EventListener.callEnd()` when the response body is consumed inside an
+ interceptor.
+
+
+## Version 3.10.0
+
+_2018-02-24_
+
+ * **The pingInterval() feature now aggressively checks connectivity for web
+ sockets and HTTP/2 connections.**
+
+ Previously if you configured a ping interval that would cause OkHttp to send
+ pings, but it did not track whether the reply pongs were received. With this
+ update OkHttp requires that every ping receive a response: if it does not
+ the connection will be closed and the listener's `onFailure()` method will
+ be called.
+
+ Web sockets have always been had pings, but pings on HTTP/2 connections is
+ new in this release. Pings are used for connections that are busy carrying
+ calls and for idle connections in the connection pool. (Pings do not impact
+ when pooled connections are evicted).
+
+ If you have a configured ping interval, you should confirm that it is long
+ enough for a roundtrip from client to server. If your ping interval is too
+ short, slow connections may be misinterpreted as failed connections. A ping
+ interval of 30 seconds is reasonable for most use cases.
+
+ * **OkHttp now supports [Conscrypt][conscrypt].** Conscrypt is a Java Security
+ Provider that integrates BoringSSL into the Java platform. Conscrypt
+ supports more cipher suites than the JVM’s default provider and may also
+ execute more efficiently.
+
+ To use it, first register a [Conscrypt dependency][conscrypt_dependency] in
+ your build system.
+
+ OkHttp will use Conscrypt if you set the `okhttp.platform` system property
+ to `conscrypt`.
+
+ Alternatively, OkHttp will also use Conscrypt if you install it as your
+ preferred security provider. To do so, add the following code to execute
+ before you create your `OkHttpClient`.
+
+ ```
+ Security.insertProviderAt(
+ new org.conscrypt.OpenSSLProvider(), 1);
+ ```
+
+ Conscrypt is the bundled security provider on Android so it is not necessary
+ to configure it on that platform.
+
+ * New: `HttpUrl.addQueryParameter()` percent-escapes more characters.
+ Previously several ASCII punctuation characters were not percent-escaped
+ when used with this method. This does not impact already-encoded query
+ parameters in APIs like `HttpUrl.parse()` and
+ `HttpUrl.Builder.addEncodedQueryParameter()`.
+ * New: CBC-mode ECDSA cipher suites have been removed from OkHttp's default
+ configuration: `TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` and
+ `TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA`. This tracks a [Chromium
+ change][remove_cbc_ecdsa] to remove these cipher suites because they are
+ fragile and rarely-used.
+ * New: Don't fall back to common name (CN) verification for hostnames. This
+ behavior was deprecated with RFC 2818 in May 2000 and was recently dropped
+ from major web browsers.
+ * New: Honor the `Retry-After` response header. HTTP 503 (Unavailable)
+ responses are retried automatically if this header is present and its delay
+ is 0 seconds. HTTP 408 (Client Timeout) responses are retried automatically
+ if the header is absent or its delay is 0 seconds.
+ * New: Allow request bodies for all HTTP methods except GET and HEAD.
+ * New: Automatic module name of `okhttp3` for use with the Java Platform
+ Module System.
+ * New: Log gzipped bodies when `HttpLoggingInterceptor` is used as a network
+ interceptor.
+ * New: `Protocol.QUIC` constant. This protocol is not supported but this
+ constant is included for completeness.
+ * New: Upgrade to Okio 1.14.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.14.0
+
+
+ com.squareup.okio:okio:1.14.0
+ ```
+
+ * Fix: Handle `HTTP/1.1 100 Continue` status lines, even on requests that did
+ not send the `Expect: continue` request header.
+ * Fix: Do not count web sockets toward the dispatcher's per-host connection
+ limit.
+ * Fix: Avoid using invalid HTTPS sessions. This prevents OkHttp from crashing
+ with the error, `Unexpected TLS version: NONE`.
+ * Fix: Don't corrupt the response cache when a 304 (Not Modified) response
+ overrides the stored "Content-Encoding" header.
+ * Fix: Gracefully shut down the HTTP/2 connection before it exhausts the
+ namespace of stream IDs (~536 million streams).
+ * Fix: Never pass a null `Route` to `Authenticator`. There was a bug where
+ routes were omitted for eagerly-closed connections.
+
+## Version 3.9.1
+
+_2017-11-18_
+
+ * New: Recover gracefully when Android's DNS crashes with an unexpected
+ `NullPointerException`.
+ * New: Recover gracefully when Android's socket connections crash with an
+ unexpected `ClassCastException`.
+ * Fix: Don't include the URL's fragment in `encodedQuery()` when the query
+ itself is empty.
+
+## Version 3.9.0
+
+_2017-09-03_
+
+ * **Interceptors are more capable.** The `Chain` interface now offers access
+ to the call and can adjust all call timeouts. Note that this change is
+ source-incompatible for code that implements the `Chain` interface.
+ We don't expect this to be a problem in practice!
+
+ * **OkHttp has an experimental new API for tracking metrics.** The new
+ `EventListener` API is designed to help developers monitor HTTP requests'
+ size and duration. This feature is an unstable preview: the API is subject
+ to change, and the implementation is incomplete. This is a big new API we
+ are eager for feedback.
+
+ * New: Support ALPN via Google Play Services' Dynamic Security Provider. This
+ expands HTTP/2 support to older Android devices that have Google Play
+ Services.
+ * New: Consider all routes when looking for candidate coalesced connections.
+ This increases the likelihood that HTTP/2 connections will be shared.
+ * New: Authentication challenges and credentials now use a charset. Use this in
+ your authenticator to support user names and passwords with non-ASCII
+ characters.
+ * New: Accept a charset in `FormBody.Builder`. Previously form bodies were
+ always UTF-8.
+ * New: Support the `immutable` cache-control directive.
+ * Fix: Don't crash when an HTTP/2 call is redirected while the connection is
+ being shut down.
+ * Fix: Don't drop headers of healthy streams that raced with `GOAWAY` frames.
+ This bug would cause HTTP/2 streams to occasional hang when the connection
+ was shutting down.
+ * Fix: Honor `OkHttpClient.retryOnConnectionFailure()` when the response is a
+ HTTP 408 Request Timeout. If retries are enabled, OkHttp will retry exactly
+ once in response to a 408.
+ * Fix: Don't crash when reading the empty `HEAD` response body if it specifies
+ a `Content-Length`.
+ * Fix: Don't crash if the thread is interrupted while reading the public
+ suffix database.
+ * Fix: Use relative resource path when loading the public suffix database.
+ Loading the resource using a path relative to the class prevents conflicts
+ when the OkHttp classes are relocated (shaded) by allowing multiple private
+ copies of the database.
+ * Fix: Accept cookies for URLs that have an IPv6 address for a host.
+ * Fix: Don't log the protocol (HTTP/1.1, h2) in HttpLoggingInterceptor if the
+ protocol isn't negotiated yet! Previously we'd log HTTP/1.1 by default, and
+ this was confusing.
+ * Fix: Omit the message from MockWebServer's HTTP/2 `:status` header.
+ * Fix: Handle 'Expect: 100 Continue' properly in MockWebServer.
+
+
+## Version 3.8.1
+
+_2017-06-18_
+
+ * Fix: Recover gracefully from stale coalesced connections. We had a bug where
+ connection coalescing (introduced in OkHttp 3.7.0) and stale connection
+ recovery could interact to cause a `NoSuchElementException` crash in the
+ `RouteSelector`.
+
+
+## Version 3.8.0
+
+_2017-05-13_
+
+
+ * **OkHttp now uses `@Nullable` to annotate all possibly-null values.** We've
+ added a compile-time dependency on the JSR 305 annotations. This is a
+ [provided][maven_provided] dependency and does not need to be included in
+ your build configuration, `.jar` file, or `.apk`. We use
+ `@ParametersAreNonnullByDefault` and all parameters and return types are
+ never null unless explicitly annotated `@Nullable`.
+
+ * **Warning: this release is source-incompatible for Kotlin users.**
+ Nullability was previously ambiguous and lenient but now the compiler will
+ enforce strict null checks.
+
+ * New: The response message is now non-null. This is the "Not Found" in the
+ status line "HTTP 404 Not Found". If you are building responses
+ programmatically (with `new Response.Builder()`) you must now always supply
+ a message. An empty string `""` is permitted. This value was never null on
+ responses returned by OkHttp itself, and it was an old mistake to permit
+ application code to omit a message.
+
+ * The challenge's scheme and realm are now non-null. If you are calling
+ `new Challenge(scheme, realm)` you must provide non-null values. These were
+ never null in challenges created by OkHttp, but could have been null in
+ application code that creates challenges.
+
+ * New: The `TlsVersion` of a `Handshake` is now non-null. If you are calling
+ `Handshake.get()` with a null TLS version, you must instead now provide a
+ non-null `TlsVersion`. Cache responses persisted prior to OkHttp 3.0 did not
+ store a TLS version; for these unknown values the handshake is defaulted to
+ `TlsVersion.SSL_3_0`.
+
+ * New: Upgrade to Okio 1.13.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.13.0
+
+
+ com.squareup.okio:okio:1.13.0
+ ```
+
+ * Fix: gracefully recover when Android 7.0's sockets throw an unexpected
+ `NullPointerException`.
+
+## Version 3.7.0
+
+_2017-04-15_
+
+ * **OkHttp no longer recovers from TLS handshake failures by attempting a TLSv1 connection.**
+ The fallback was necessary for servers that implemented version negotiation incorrectly. Now
+ that 99.99% of servers do it right this fallback is obsolete.
+ * Fix: Do not honor cookies set on a public domain. Previously a malicious site could inject
+ cookies on top-level domains like `co.uk` because our cookie parser didn't honor the [public
+ suffix][public_suffix] list. Alongside this fix is a new API, `HttpUrl.topPrivateDomain()`,
+ which returns the privately domain name if the URL has one.
+ * Fix: Change `MediaType.charset()` to return null for unexpected charsets.
+ * Fix: Don't skip cache invalidation if the invalidating response has no body.
+ * Fix: Don't use a cryptographic random number generator for web sockets. Some Android devices
+ implement `SecureRandom` incorrectly!
+ * Fix: Correctly canonicalize IPv6 addresses in `HttpUrl`. This prevented OkHttp from trusting
+ HTTPS certificates issued to certain IPv6 addresses.
+ * Fix: Don't reuse connections after an unsuccessful `Expect: 100-continue`.
+ * Fix: Handle either `TLS_` or `SSL_` prefixes for cipher suite names. This is necessary for
+ IBM JVMs that use the `SSL_` prefix exclusively.
+ * Fix: Reject HTTP/2 data frames if the stream ID is 0.
+ * New: Upgrade to Okio 1.12.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.12.0
+
+
+ com.squareup.okio:okio:1.12.0
+ ```
+
+ * New: Connection coalescing. OkHttp may reuse HTTP/2 connections across calls that share an IP
+ address and HTTPS certificate, even if their domain names are different.
+ * New: MockWebServer's `RecordedRequest` exposes the requested `HttpUrl` with `getRequestUrl()`.
+
+
+## Version 3.6.0
+
+_2017-01-29_
+
+ * Fix: Don't crash with a "cache is closed" error when there is an error initializing the cache.
+ * Fix: Calling `disconnect()` on a connecting `HttpUrlConnection` could cause it to retry in an
+ infinite loop! This regression was introduced in OkHttp 2.7.0.
+ * Fix: Drop cookies that contain ASCII NULL and other bad characters. Previously such cookies
+ would cause OkHttp to crash when they were included in a request.
+ * Fix: Release duplicated multiplexed connections. If we concurrently establish connections to an
+ HTTP/2 server, close all but the first connection.
+ * Fix: Fail the HTTP/2 connection if first frame isn't `SETTINGS`.
+ * Fix: Forbid spaces in header names.
+ * Fix: Don't offer to do gzip if the request is partial.
+ * Fix: MockWebServer is now usable with JUnit 5. That update [broke the rules][junit_5_rules].
+ * New: Support `Expect: 100-continue` as a request header. Callers can use this header to
+ pessimistically hold off on transmitting a request body until a server gives the go-ahead.
+ * New: Permit network interceptors to rewrite the host header for HTTP/2. This makes it possible
+ to do domain fronting.
+ * New: charset support for `Credentials.basic()`.
+
+
+## Version 3.5.0
+
+_2016-11-30_
+
+ * **Web Sockets are now a stable feature of OkHttp.** Since being introduced as a beta feature in
+ OkHttp 2.3 our web socket client has matured. Connect to a server's web socket with
+ `OkHttpClient.newWebSocket()`, send messages with `send()`, and receive messages with the
+ `WebSocketListener`.
+
+ The `okhttp-ws` submodule is no longer available and `okhttp-ws` artifacts from previous
+ releases of OkHttp are not compatible with OkHttp 3.5. When upgrading to the new package
+ please note that the `WebSocket` and `WebSocketCall` classes have been merged. Sending messages
+ is now asynchronous and they may be enqueued before the web socket is connected.
+
+ * **OkHttp no longer attempts a direct connection if the system's HTTP proxy fails.** This
+ behavior was surprising because OkHttp was disregarding the user's specified configuration. If
+ you need to customize proxy fallback behavior, implement your own `java.net.ProxySelector`.
+
+ * Fix: Support TLSv1.3 on devices that support it.
+
+ * Fix: Share pooled connections across equivalent `OkHttpClient` instances. Previous releases had
+ a bug where a shared connection pool did not guarantee shared connections in some cases.
+ * Fix: Prefer the server's response body on all conditional cache misses. Previously we would
+ return the cached response's body if it had a newer `Last-Modified` date.
+ * Fix: Update the stored timestamp on conditional cache hits.
+ * New: Optimized HTTP/2 request header encoding. More headers are HPACK-encoded and string
+ literals are now Huffman-encoded.
+ * New: Expose `Part` headers and body in `Multipart`.
+ * New: Make `ResponseBody.string()` and `ResponseBody.charStream()` BOM-aware. If your HTTP
+ response body begins with a [byte order mark][bom] it will be consumed and used to select a
+ charset for the remaining bytes. Most applications should not need a byte order mark.
+
+ * New: Upgrade to Okio 1.11.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.11.0
+
+
+ com.squareup.okio:okio:1.11.0
+ ```
+
+ * Fix: Avoid sending empty HTTP/2 data frames when there is no request body.
+ * Fix: Add a leading `.` for better domain matching in `JavaNetCookieJar`.
+ * Fix: Gracefully recover from HTTP/2 connection shutdowns at start of request.
+ * Fix: Be lenient if a `MediaType`'s character set is `'single-quoted'`.
+ * Fix: Allow horizontal tab characters in header values.
+ * Fix: When parsing HTTP authentication headers permit challenge parameters in any order.
+
+
+## Version 3.4.2
+
+_2016-11-03_
+
+ * Fix: Recover gracefully when an HTTP/2 connection is shutdown. We had a
+ bug where shutdown HTTP/2 connections were considered usable. This caused
+ infinite loops when calls attempted to recover.
+
+
+## Version 3.4.1
+
+_2016-07-10_
+
+ * **Fix a major bug in encoding HTTP headers.** In 3.4.0 and 3.4.0-RC1 OkHttp
+ had an off-by-one bug in our HPACK encoder. This bug could have caused the
+ wrong headers to be emitted after a sequence of HTTP/2 requests! Everyone
+ who is using OkHttp 3.4.0 or 3.4.0-RC1 should upgrade for this bug fix.
+
+
+## Version 3.4.0
+
+_2016-07-08_
+
+ * New: Support dynamic table size changes to HPACK Encoder.
+ * Fix: Use `TreeMap` in `Headers.toMultimap()`. This makes string lookups on
+ the returned map case-insensitive.
+ * Fix: Don't share the OkHttpClient's `Dispatcher` in `HttpURLConnection`.
+
+
+## Version 3.4.0-RC1
+
+_2016-07-02_
+
+ * **We’ve rewritten HttpURLConnection and HttpsURLConnection.** Previously we
+ shared a single HTTP engine between two frontend APIs: `HttpURLConnection`
+ and `Call`. With this release we’ve rearranged things so that the
+ `HttpURLConnection` frontend now delegates to the `Call` APIs internally.
+ This has enabled substantial simplifications and optimizations in the OkHttp
+ core for both frontends.
+
+ For most HTTP requests the consequences of this change will be negligible.
+ If your application uses `HttpURLConnection.connect()`,
+ `setFixedLengthStreamingMode()`, or `setChunkedStreamingMode()`, OkHttp will
+ now use a async dispatcher thread to establish the HTTP connection.
+
+ We don’t expect this change to have any behavior or performance
+ consequences. Regardless, please exercise your `OkUrlFactory` and
+ `HttpURLConnection` code when applying this update.
+
+ * **Cipher suites may now have arbitrary names.** Previously `CipherSuite` was
+ a Java enum and it was impossible to define new cipher suites without first
+ upgrading OkHttp. With this change it is now a regular Java class with
+ enum-like constants. Application code that uses enum methods on cipher
+ suites (`ordinal()`, `name()`, etc.) will break with this change.
+
+ * Fix: `CertificatePinner` now matches canonicalized hostnames. Previously
+ this was case sensitive. This change should also make it easier to configure
+ certificate pinning for internationalized domain names.
+ * Fix: Don’t crash on non-ASCII `ETag` headers. Previously OkHttp would reject
+ these headers when validating a cached response.
+ * Fix: Don’t allow remote peer to arbitrarily size the HPACK decoder dynamic
+ table.
+ * Fix: Honor per-host configuration in Android’s network security config.
+ Previously disabling cleartext for any host would disable cleartext for all
+ hosts. Note that this setting is only available on Android 24+.
+ * New: HPACK compression is now dynamic. This should improve performance when
+ transmitting request headers over HTTP/2.
+ * New: `Dispatcher.setIdleCallback()` can be used to signal when there are no
+ calls in flight. This is useful for [testing with
+ Espresso][okhttp_idling_resource].
+ * New: Upgrade to Okio 1.9.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.9.0
+
+ ```
+
+
+## Version 3.3.1
+
+_2016-05-28_
+
+ * Fix: The plaintext check in HttpLoggingInterceptor incorrectly classified
+ newline characters as control characters. This is fixed.
+ * Fix: Don't crash reading non-ASCII characters in HTTP/2 headers or in cached
+ HTTP headers.
+ * Fix: Retain the response body when an attempt to open a web socket returns a
+ non-101 response code.
+
+
+## Version 3.3.0
+
+_2016-05-24_
+
+ * New: `Response.sentRequestAtMillis()` and `receivedResponseAtMillis()`
+ methods track the system's local time when network calls are made. These
+ replace the `OkHttp-Sent-Millis` and `OkHttp-Received-Millis` headers that were
+ present in earlier versions of OkHttp.
+ * New: Accept user-provided trust managers in `OkHttpClient.Builder`. This
+ allows OkHttp to satisfy its TLS requirements directly. Otherwise OkHttp
+ will use reflection to extract the `TrustManager` from the
+ `SSLSocketFactory`.
+ * New: Support prerelease Java 9. This gets ALPN from the platform rather than
+ relying on the alpn-boot bootclasspath override.
+ * New: `HttpLoggingInterceptor` now logs connection failures.
+ * New: Upgrade to Okio 1.8.0.
+
+ ```xml
+
+ com.squareup.okio
+ okio
+ 1.8.0
+
+ ```
+
+ * Fix: Gracefully recover from a failure to rebuild the cache journal.
+ * Fix: Don't corrupt cache entries when a cache entry is evicted while it is
+ being updated.
+ * Fix: Make logging more consistent throughout OkHttp.
+ * Fix: Log plaintext bodies only. This uses simple heuristics to differentiate
+ text from other data.
+ * Fix: Recover from `REFUSED_STREAM` errors in HTTP/2. This should improve
+ interoperability with Nginx 1.10.0, which [refuses][nginx_959] streams
+ created before HTTP/2 settings have been acknowledged.
+ * Fix: Improve recovery from failed routes.
+ * Fix: Accommodate tunneling proxies that close the connection after an auth
+ challenge.
+ * Fix: Use the proxy authenticator when authenticating HTTP proxies. This
+ regression was introduced in OkHttp 3.0.
+ * Fix: Fail fast if network interceptors transform the response body such that
+ closing it doesn't also close the underlying stream. We had a bug where
+ OkHttp would attempt to reuse a connection but couldn't because it was still
+ held by a prior request.
+ * Fix: Ensure network interceptors always have access to the underlying
+ connection.
+ * Fix: Use `X509TrustManagerExtensions` on Android 17+.
+ * Fix: Unblock waiting dispatchers on MockWebServer shutdown.
+
+
+## Version 3.2.0
+
+_2016-02-25_
+
+ * Fix: Change the certificate pinner to always build full chains. This
+ prevents a potential crash when using certificate pinning with the Google
+ Play Services security provider.
+ * Fix: Make IPv6 request lines consistent with Firefox and Chrome.
+ * Fix: Recover gracefully when trimming the response cache fails.
+ * New: Add multiple path segments using a single string in `HttpUrl.Builder`.
+ * New: Support SHA-256 pins in certificate pinner.
+
+
+## Version 3.1.2
+
+_2016-02-10_
+
+ * Fix: Don’t crash when finding the trust manager on Robolectric. We attempted
+ to detect the host platform and got confused because Robolectric looks like
+ Android but isn’t!
+ * Fix: Change `CertificatePinner` to skip sanitizing the certificate chain
+ when no certificates were pinned. This avoids an SSL failure in insecure
+ “trust everyone” configurations, such as when talking to a development
+ HTTPS server that has a self-signed certificate.
+
+
+## Version 3.1.1
+
+_2016-02-07_
+
+ * Fix: Don't crash when finding the trust manager if the Play Services (GMS)
+ security provider is installed.
+ * Fix: The previous release introduced a performance regression on Android,
+ caused by looking up CA certificates. This is now fixed.
+
+
+## Version 3.1.0
+
+_2016-02-06_
+
+ * New: WebSockets now defer some writes. This should improve performance for
+ some applications.
+ * New: Override `equals()` and `hashCode()` in our new cookie class. This
+ class now defines equality by value rather than by reference.
+ * New: Handle 408 responses by retrying the request. This allows servers to
+ direct clients to retry rather than failing permanently.
+ * New: Expose the framed protocol in `Connection`. Previously this would
+ return the application-layer protocol (HTTP/1.1 or HTTP/1.0); now it always
+ returns the wire-layer protocol (HTTP/2, SPDY/3.1, or HTTP/1.1).
+ * Fix: Permit the trusted CA root to be pinned by `CertificatePinner`.
+ * Fix: Silently ignore unknown HTTP/2 settings. Previously this would cause
+ the entire connection to fail.
+ * Fix: Don’t crash on unexpected charsets in the logging interceptor.
+ * Fix: `OkHttpClient` is now non-final for the benefit of mocking frameworks.
+ Mocking sophisticated classes like `OkHttpClient` is fragile and you
+ shouldn’t do it. But if that’s how you want to live your life we won’t stand
+ in your way!
+
+
+## Version 3.0.1
+
+_2016-01-14_
+
+ * Rollback OSGi support. This was causing library jars to include more classes
+ than expected, which interfered with Gradle builds.
+
+
+## Version 3.0.0
+
+_2016-01-13_
+
+This release commits to a stable 3.0 API. Read the 3.0.0-RC1 changes for advice
+on upgrading from 2.x to 3.x.
+
+ * **The `Callback` interface now takes a `Call`**. This makes it easier to
+ check if the call was canceled from within the callback. When migrating
+ async calls to this new API, `Call` is now the first parameter for both
+ `onResponse()` and `onFailure()`.
+ * Fix: handle multiple cookies in `JavaNetCookieJar` on Android.
+ * Fix: improve the default HTTP message in MockWebServer responses.
+ * Fix: don't leak file handles when a conditional GET throws.
+ * Fix: Use charset specified by the request body content type in OkHttp's
+ logging interceptor.
+ * Fix: Don't eagerly release pools on cache hits.
+ * New: Make OkHttp OSGi ready.
+ * New: Add already-implemented interfaces Closeable and Flushable to the cache.
+
+
+## Version 3.0.0-RC1
+
+_2016-01-02_
+
+OkHttp 3 is a major release focused on API simplicity and consistency. The API
+changes are numerous but most are cosmetic. Applications should be able to
+upgrade from the 2.x API to the 3.x API mechanically and without risk.
+
+Because the release includes breaking API changes, we're changing the project's
+package name from `com.squareup.okhttp` to `okhttp3`. This should make it
+possible for large applications to migrate incrementally. The Maven group ID
+is now `com.squareup.okhttp3`. For an explanation of this strategy, see Jake
+Wharton's post, [Java Interoperability Policy for Major Version
+Updates][major_versions].
+
+This release obsoletes OkHttp 2.x, and all code that uses OkHttp's
+`com.squareup.okhttp` package should upgrade to the `okhttp3` package. Libraries
+that depend on OkHttp should upgrade quickly to prevent applications from being
+stuck on the old version.
+
+ * **There is no longer a global singleton connection pool.** In OkHttp 2.x,
+ all `OkHttpClient` instances shared a common connection pool by default.
+ In OkHttp 3.x, each new `OkHttpClient` gets its own private connection pool.
+ Applications should avoid creating many connection pools as doing so
+ prevents connection reuse. Each connection pool holds its own set of
+ connections alive so applications that have many pools also risk exhausting
+ memory!
+
+ The best practice in OkHttp 3 is to create a single OkHttpClient instance
+ and share it throughout the application. Requests that needs a customized
+ client should call `OkHttpClient.newBuilder()` on that shared instance.
+ This allows customization without the drawbacks of separate connection
+ pools.
+
+ * **OkHttpClient is now stateless.** In the 2.x API `OkHttpClient` had getters
+ and setters. Internally each request was forced to make its own complete
+ snapshot of the `OkHttpClient` instance to defend against racy configuration
+ changes. In 3.x, `OkHttpClient` is now stateless and has a builder. Note
+ that this class is not strictly immutable as it has stateful members like
+ the connection pool and cache.
+
+ * **Get and Set prefixes are now avoided.** With ubiquitous builders
+ throughout OkHttp these accessor prefixes aren't necessary. Previously
+ OkHttp used _get_ and _set_ prefixes sporadically which make the API
+ inconsistent and awkward to explore.
+
+ * **OkHttpClient now implements the new `Call.Factory` interface.** This
+ interface will make your code easier to test. When you test code that makes
+ HTTP requests, you can use this interface to replace the real `OkHttpClient`
+ with your own mocks or fakes.
+
+ The interface will also let you use OkHttp's API with another HTTP client's
+ implementation. This is useful in sandboxed environments like Google App
+ Engine.
+
+ * **OkHttp now does cookies.** We've replaced `java.net.CookieHandler` with
+ a new interface, `CookieJar` and added our own `Cookie` model class. This
+ new cookie follows the latest RFC and supports the same cookie attributes
+ as modern web browsers.
+
+ * **Form and Multipart bodies are now modeled.** We've replaced the opaque
+ `FormEncodingBuilder` with the more powerful `FormBody` and
+ `FormBody.Builder` combo. Similarly we've upgraded `MultipartBuilder` into
+ `MultipartBody`, `MultipartBody.Part`, and `MultipartBody.Builder`.
+
+ * **The Apache HTTP client and HttpURLConnection APIs are deprecated.** They
+ continue to work as they always have, but we're moving everything to the new
+ OkHttp 3 API. The `okhttp-apache` and `okhttp-urlconnection` modules should
+ be only be used to accelerate a transition to OkHttp's request/response API.
+ These deprecated modules will be dropped in an upcoming OkHttp 3.x release.
+
+ * **Canceling batches of calls is now the application's responsibility.**
+ The API to cancel calls by tag has been removed and replaced with a more
+ general mechanism. The dispatcher now exposes all in-flight calls via its
+ `runningCalls()` and `queuedCalls()` methods. You can write code that
+ selects calls by tag, host, or whatever, and invokes `Call.cancel()` on the
+ ones that are no longer necessary.
+
+ * **OkHttp no longer uses the global `java.net.Authenticator` by default.**
+ We've changed our `Authenticator` interface to authenticate web and proxy
+ authentication failures through a single method. An adapter for the old
+ authenticator is available in the `okhttp-urlconnection` module.
+
+ * Fix: Don't throw `IOException` on `ResponseBody.contentLength()` or `close()`.
+ * Fix: Never throw converting an `HttpUrl` to a `java.net.URI`. This changes
+ the `uri()` method to handle malformed percent-escapes and characters
+ forbidden by `URI`.
+ * Fix: When a connect times out, attempt an alternate route. Previously route
+ selection was less efficient when differentiating failures.
+ * New: `Response.peekBody()` lets you access the response body without
+ consuming it. This may be handy for interceptors!
+ * New: `HttpUrl.newBuilder()` resolves a link to a builder.
+ * New: Add the TLS version to the `Handshake`.
+ * New: Drop `Request.uri()` and `Request#urlString()`. Just use
+ `Request.url().uri()` and `Request.url().toString()`.
+ * New: Add URL to HTTP response logging.
+ * New: Make `HttpUrl` the blessed URL method of `Request`.
+
+
+## Version 2.x
+
+[Change log](changelog_2x.md)
+
+
+ [bom]: https://en.wikipedia.org/wiki/Byte_order_mark
+ [conscrypt]: https://github.com/google/conscrypt/
+ [conscrypt_dependency]: https://github.com/google/conscrypt/#download
+ [grpc_http2]: https://github.com/grpc/grpc/blob/master/doc/PROTOCOL-HTTP2.md
+ [https_server_sample]: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/HttpsServer.java
+ [junit_5_rules]: https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-rulesupport
+ [major_versions]: https://jakewharton.com/java-interoperability-policy-for-major-version-updates/
+ [maven_provided]: https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
+ [nginx_959]: https://trac.nginx.org/nginx/ticket/959
+ [obsolete_apache_client]: https://gist.github.com/swankjesse/09721f72039e3a46cf50f94323deb82d
+ [obsolete_url_factory]: https://gist.github.com/swankjesse/dd91c0a8854e1559b00f5fc9c7bfae70
+ [okhttp_idling_resource]: https://github.com/JakeWharton/okhttp-idling-resource
+ [public_suffix]: https://publicsuffix.org/
+ [remove_cbc_ecdsa]: https://developers.google.com/web/updates/2016/12/chrome-56-deprecations#remove_cbc-mode_ecdsa_ciphers_in_tls
+ [require_android_5]: https://cashapp.github.io/2019-02-05/okhttp-3-13-requires-android-5
+ [tls_configuration_history]: https://square.github.io/okhttp/tls_configuration_history/
+ [upgrading_to_okhttp_4]: https://square.github.io/okhttp/upgrading_to_okhttp_4/