commit | f3bcd0c7f0741b277b5d58f294df6201dafd45e8 | [log] [tgz] |
---|---|---|
author | Neil Fuller <nfuller@google.com> | Wed Nov 19 18:50:41 2014 +0000 |
committer | Neil Fuller <nfuller@google.com> | Thu Nov 20 10:31:15 2014 +0000 |
tree | 70285adbd740672a0a783a61c2a66324bbe8a23a | |
parent | cc168fec727bd90ca6582e21a59ec5d718cebf7a [diff] |
Fix for a socket leak in OkHttp on Android When the preferred Android network changes from cell -> wifi or wifi -> cell the HTTP connection pool in use is abandoned to avoid reuse of connections on the old network. This was added in commit 8bced3e. The design for the connection pool was such that continuous use of the connection pool was required to clean up idle / expired connections. If a connection pool becomes idle (as when it is dereferenced on a network change) it is possible for some connections to remain in the pool indefinitely. After the preferred network change, because the old connection pool was no longer referenced the pool would be garbage collected and Android's "Strict Mode" would complain about sockets not being closed. The only existing way to avoid this was to call "evictAll()", which would have had issues when a large number of connections were returned to the pool after evictAll() was called. It also wouldn't work for SPDY connections which are shared but not reference counted, which makes knowing whether it is safe to close them difficult. SPDY is not enabled on Android by default and so that may have been safe to ignore. This fix tries to keep the existing cleaning behavior intact to avoid introducing new bugs or new thread behavior that might impact battery life. It adds a new mode to the pool for "draining", which handles cleaning up any existing entries in the pool and any added after the pool has been placed into draining mode. The drainModeRunnable introduced serves two purposes: 1) While scheduled / executing, it pins the connection pool in memory to avoid it being garbage collected. 2) It continues to close connections (safely) until the pool is empty. If a connection is then added back to the pool the drainModeRunnable is restarted. Bug: 18369687 (cherry picked from commit ff345b6c0ffcc691e4c3c594f8a222cf81bb325c) Change-Id: I4e9e530f8e7acedf4b9a806237c8769a10671feb
An HTTP & SPDY client for Android and Java applications.
For more information please see the website.
Download the latest JAR or grab via Maven:
<dependency> <groupId>com.squareup.okhttp</groupId> <artifactId>okhttp</artifactId> <version>(insert latest version)</version> </dependency>
OkHttp requires Java 7 to build and run tests. Runtime compatibility with Java 6 is enforced as part of the build to ensure compliance with Android and older versions of the JVM.
Run OkHttp tests on the desktop with Maven. Running SPDY tests on the desktop uses Jetty-NPN which requires OpenJDK 7+.
mvn clean test
OkHttp's test suite creates an in-process HTTPS server. Prior to Android 2.3, SSL server sockets were broken, and so HTTPS tests will time out when run on such devices.
Test on a USB-attached Android using Vogar. Unfortunately dx
requires that you build with Java 6, otherwise the test class will be silently omitted from the .dex
file.
mvn clean mvn package -DskipTests vogar \ --classpath ~/.m2/repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar \ --classpath mockwebserver/target/mockwebserver-2.0.0-SNAPSHOT.jar \ --classpath okhttp-protocols/target/okhttp-protocols-2.0.0-SNAPSHOT.jar \ --classpath okhttp/target/okhttp-2.0.0-SNAPSHOT.jar \ okhttp/src/test
A library for testing HTTP, HTTPS, HTTP/2.0, and SPDY clients.
MockWebServer coupling with OkHttp is essential for proper testing of SPDY and HTTP/2.0 so that code can be shared.
Download the latest JAR or grab via Maven:
<dependency> <groupId>com.squareup.okhttp</groupId> <artifactId>mockwebserver</artifactId> <version>(insert latest version)</version> <scope>test</scope> </dependency>
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.