-
Notifications
You must be signed in to change notification settings - Fork 459
chunked encoding + GZIP prevents keep-alive #367
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Comments
It's possible this only applies for some |
We've worked around this in our code for now, but it's definitely worth fixing in the underlying library. 😄 |
This is really weird. Is the issue that there's a GZIP file/blob in a much larger stream that contains extra data after the end of the gzipped part? |
IIRC, the issue occurs when the GZIPed content is chunked, so there is a The |
Note that the hack we put in place for google-cloud-datastore is going to become increasingly inconvenient in future JDK releases. |
If a connection is closed and there are some bytes that have not been read that connection can't be reused. Now GZIPInputStream will have all of its bytes read on close automatically to promote connection reuse. Checkpicked from: googleapis#749 Fixes: googleapis#367
If a connection is closed and there are some bytes that have not been read that connection can't be reused. Now GZIPInputStream will have all of its bytes read on close automatically to promote connection reuse. Cherry-picked: googleapis#749 Fixes: googleapis#367
I believe the solution implemented in #840 is inadequate. Consider the following test case, which is very similar to the code used in the
I expect the above code to open only 1 connection due to keep-alive, but it actually opens 3:
The solution in #840 simply wraps the
But this won't change the behavior, because
Since To get the desired keep-alive behavior we need to do something like the following in the test case:
|
Previous implementation doesn't properly cleanup the last chunk of a chunked response when the response is also gzipped. This in turns prevents proper connection reuse. Fixes #367
🤖 I have created a release \*beep\* \*boop\* --- ## [1.35.0](https://github.com/googleapis/google-http-java-client/compare/v1.34.2...v1.35.0) (2020-04-27) ### Features * add logic for verifying ES256 JsonWebSignatures ([#1033](https://github.com/googleapis/google-http-java-client/issues/1033)) ([bb4227f](https://github.com/googleapis/google-http-java-client/commit/bb4227f9daec44fc2976fa9947e2ff5ee07ed21a)) ### Bug Fixes * add linkage monitor plugin ([#1000](https://github.com/googleapis/google-http-java-client/issues/1000)) ([027c227](https://github.com/googleapis/google-http-java-client/commit/027c227e558164f77be204152fb47023850b543f)) * Correctly handling chunked response streams with gzip ([#990](https://github.com/googleapis/google-http-java-client/issues/990)) ([1ba2197](https://github.com/googleapis/google-http-java-client/commit/1ba219743e65c89bc3fdb196acc5d2042e01f542)), closes [#367](https://github.com/googleapis/google-http-java-client/issues/367) * FileDataStoreFactory will throw IOException for any permissions errors ([#1012](https://github.com/googleapis/google-http-java-client/issues/1012)) ([fd33073](https://github.com/googleapis/google-http-java-client/commit/fd33073da3674997897d7a9057d1d0e9d42d7cd4)) * include request method and URL into HttpResponseException message ([#1002](https://github.com/googleapis/google-http-java-client/issues/1002)) ([15111a1](https://github.com/googleapis/google-http-java-client/commit/15111a1001d6f72cb92cd2d76aaed6f1229bc14a)) * incorrect check for Windows OS in FileDataStoreFactory ([#927](https://github.com/googleapis/google-http-java-client/issues/927)) ([8b4eabe](https://github.com/googleapis/google-http-java-client/commit/8b4eabe985794fc64ad6a4a53f8f96201cf73fb8)) * reuse reference instead of calling getter twice ([#983](https://github.com/googleapis/google-http-java-client/issues/983)) ([1f66222](https://github.com/googleapis/google-http-java-client/commit/1f662224d7bee6e27e8d66975fda39feae0c9359)), closes [#982](https://github.com/googleapis/google-http-java-client/issues/982) * **android:** set minimum API level to 19 a.k.a. 4.4 Kit Kat ([#1016](https://github.com/googleapis/google-http-java-client/issues/1016)) ([b9a8023](https://github.com/googleapis/google-http-java-client/commit/b9a80232c9c8b16a3c3277458835f72e346f6b2c)), closes [#1015](https://github.com/googleapis/google-http-java-client/issues/1015) ### Documentation * android 4.4 or later is required ([#1008](https://github.com/googleapis/google-http-java-client/issues/1008)) ([bcc41dd](https://github.com/googleapis/google-http-java-client/commit/bcc41dd615af41ae6fb58287931cbf9c2144a075)) * libraries-bom 4.0.1 ([#976](https://github.com/googleapis/google-http-java-client/issues/976)) ([fc21dc4](https://github.com/googleapis/google-http-java-client/commit/fc21dc412566ef60d23f1f82db5caf3cfd5d447b)) * libraries-bom 4.1.1 ([#984](https://github.com/googleapis/google-http-java-client/issues/984)) ([635c813](https://github.com/googleapis/google-http-java-client/commit/635c81352ae383b3abfe6d7c141d987a6944b3e9)) * libraries-bom 5.2.0 ([#1032](https://github.com/googleapis/google-http-java-client/issues/1032)) ([ca34202](https://github.com/googleapis/google-http-java-client/commit/ca34202bfa077adb70313b6c4562c7a5d904e064)) * require Android 4.4 ([#1007](https://github.com/googleapis/google-http-java-client/issues/1007)) ([f9d2bb0](https://github.com/googleapis/google-http-java-client/commit/f9d2bb030398fe09e3c47b84ea468603355e08e9)) ### Dependencies * httpclient 4.5.12 ([#991](https://github.com/googleapis/google-http-java-client/issues/991)) ([79bc1c7](https://github.com/googleapis/google-http-java-client/commit/79bc1c76ebd48d396a080ef715b9f07cd056b7ef)) * update to Guava 29 ([#1024](https://github.com/googleapis/google-http-java-client/issues/1024)) ([ca9520f](https://github.com/googleapis/google-http-java-client/commit/ca9520f2da4babc5bbd28c828da1deb7dbdc87e5)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please).
GZIPInputStream.read()
starts returning -1 once it finishes reading the gzip trailer. Depending on the underlyingInputStream
, this may occur before it has finished consuming the underlyingInputStream
.In particular, if the underlying
InputStream
is aChunkedInputStream
, theChunkedInputStream
never reads the final chunk header (which indicates a chunk of length 0).When
ChunkedInputStream.close()
is called, it is in a non-STATE_DONE state, and does not callHttpClient.finished()
, which is required for theHttpClient
object to get into the keep alive cache.One possible fix is here:
https://github.com/google/google-http-java-client/blob/acdaeacc3c43402d795266d2ebcb584abe918961/google-http-client/src/main/java/com/google/api/client/http/HttpResponse.java#L363
Rather than returning a
GZIPInputStream
, return a proxy input stream that retains references to both the gzip stream and the underlying stream. The proxy'sclose()
method first consumes the underlying stream by callingread()
and then callsclose()
on the gzip stream.The text was updated successfully, but these errors were encountered: