This fixes a regression introduced by 
[JDK-8317808](https://bugs.openjdk.org/browse/JDK-8317808). If the server sends 
all the response bytes, sends a GOAWAY, and immediately closes the connection 
since all streams are closed on its side, the client may fail to complete the 
request properly although all bytes have been received.
Upon noticing that the connection is closed the client will interrupt all 
exchanges, even those for which all bytes have been received (but not yet 
pulled).

This typically happens when the response body is delivered as an InputStream.

The same issue also happens with HTTP/3.

For HTTP/2 we will allow the BodySubscriber to continue pulling the bytes, 
unless we notice that the bodyCF is completed exceptionally. 

For HTTP/3 the logic is a bit different: when the connection is closed it 
forcefully terminates all exchanges. We will skip those exchange for which the 
underlying QUIC receiving stream state is DATA_READ or DATA_RCVD (and which are 
not blocked by QPack)

Testing:

A new scenario is added to 
test/jdk/java/net/httpclient/http2/H2GoAwayPromptConnectionClose.java to test 
the HTTP/2 changes. A new test is added for HTTP/3. 

Both tests fail without the fix and pass with it. Failure without the fix is 
not 100% guaranteed, but my experiments saw the tests reliably failing.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

-------------

Commit messages:
 - Add a test for the HTTP/3 case
 - Extend H2GoAwayPromptConnectionClose.java with a new scenario testing for 
the HTTP/2 changes
 - 8394607: HttpClient HTTP/2: fully received response body discarded when peer 
closes connection before InputStream is read (regression from JDK-8317808)

Changes: https://git.openjdk.org/jdk/pull/33385/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=33385&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8394607
  Stats: 510 lines in 8 files changed: 483 ins; 2 del; 25 mod
  Patch: https://git.openjdk.org/jdk/pull/33385.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/33385/head:pull/33385

PR: https://git.openjdk.org/jdk/pull/33385

Reply via email to