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
