OkHttp quick fix: canceled StreamAllocations can never recover

When a HttpURLConnection is disconnected in the middle of connecting,
this can lead to an infinite loop because:
 - StreamAllocation.findConnection() immediately throws
   (before advancing the RouteSelector)
 - StreamAllocation.recover() returns true, indicating that a
   retry is permissible
 - higher level logic then retries the connection indefinitely in
   a busy loop

This bug does not occur in the latest version of OkHttp (3.5) but
can be reproduced directly on top of OkHttp 2.7.5.

To give us more time to figure out the best fix, this CL makes the
narrowest possible fix for the concrete behavior observed in the wild.

There are related cases where StreamAllocation.recover() returns true
but findConnection() immediately throws; these have not been observed
and are not addressed by this CL:
 - StreamAllocation.released; this case looks at first glance like it
   is not reachable via publicly exposed API (HttpURLConnection)
 - canceled case for recover(IOException e, Sink requestBodyOut):
   touching this breaks OkHttp's
   CallTest.canceledBeforeIOSignalsOnFailure*() because the reported
   error message becomes something like "Socket closed", rather
   than reviewed "Canceled".

Test: CtsLibcoreTestCases
Test: CtsLibcoreOkHttpTestCases

Bug: 33763156

Change-Id: Ie8e80559f9364cbd0a01c54b441fc10402b37862
(cherry picked from commit 715f88092afc34bbe129118fa9ed737ad38ec050)
1 file changed
tree: 596aea6e32250865c9141c116649bd83e5a95c6f
  1. .buildscript/
  2. android/
  3. benchmarks/
  4. mockwebserver/
  5. okcurl/
  6. okhttp/
  7. okhttp-android-support/
  8. okhttp-apache/
  9. okhttp-hpacktests/
  10. okhttp-logging-interceptor/
  11. okhttp-testing-support/
  12. okhttp-tests/
  13. okhttp-urlconnection/
  14. okhttp-ws/
  15. okhttp-ws-tests/
  16. okio/
  17. samples/
  18. website/
  19. .gitignore
  20. .gitmodules
  21. .travis.yml
  22. Android.mk
  23. BUG-BOUNTY.md
  24. CHANGELOG.md
  25. checkstyle.xml
  26. CONTRIBUTING.md
  27. deploy_website.sh
  28. jarjar-rules.txt
  29. LICENSE.txt
  30. MODULE_LICENSE_APACHE2
  31. pom.xml
  32. README.android
  33. README.md
README.md

OkHttp

An HTTP & SPDY client for Android and Java applications. For more information see the website and the wiki.

Download

Download the latest JAR or grab via Maven:

<dependency>
  <groupId>com.squareup.okhttp</groupId>
  <artifactId>okhttp</artifactId>
  <version>2.6.0</version>
</dependency>

or Gradle:

compile 'com.squareup.okhttp:okhttp:2.6.0'

Snapshots of the development version are available in Sonatype's snapshots repository.

MockWebServer

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

Download the latest JAR or grab via Maven:

<dependency>
  <groupId>com.squareup.okhttp</groupId>
  <artifactId>mockwebserver</artifactId>
  <version>2.6.0</version>
  <scope>test</scope>
</dependency>

or Gradle:

testCompile 'com.squareup.okhttp:mockwebserver:2.6.0'

License

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.