### Problem

  When the HTTP/2 client receives a GOAWAY frame with a non-zero error code, 
the current implementation discards both the error code and debug data. Users 
only see generic "Connection closed by peer" errors without any information 
about why the server terminated the connection.

  ### Solution

  Per [RFC 9113 
§5.4.1](https://www.rfc-editor.org/rfc/rfc9113.html#section-5.4.1), a GOAWAY 
frame with a non-zero error code indicates a connection error requiring 
immediate closure. This fix:

  1. **Distinguishes** graceful shutdown (NO_ERROR) from connection errors
  2. **Preserves** error code and debug data in exception messages
  3. **Categorizes** streams based on `lastStreamId`:
     - Streams with ID > `lastStreamId`: Marked as unprocessed for automatic 
retry
     - Streams with ID ≤ `lastStreamId`: Failed with detailed error information

  ### Changes

  **Core Implementation** (`Http2Connection.java`):
  - Modified `handleGoAway()` to check error code and route appropriately
  - Added `handleGoAwayWithError()` method that:
    - Extracts error code and debug data from GOAWAY frame
    - Creates meaningful error messages with error name, hex code, and debug 
data
    - Properly categorizes streams for retry or failure

  **Test Infrastructure**:
  - `Http2TestServerConnection.sendGoAway(int, int, byte[])`: Supports custom 
error codes
  - `Http2TestExchangeImpl.getServerConnection()`: Accessor for test handlers
  - `GoAwayWithErrorTest`: Verifies proper error propagation

  ### Example

  **Before:**
  IOException: Connection closed by peer

  **After:**
  IOException: Received GOAWAY with error code Protocol error (0x1): Invalid 
HEADERS frame

  ### Testing

  - New `GoAwayWithErrorTest` passes
  - Existing HTTP/2 tests unaffected (NO_ERROR path unchanged)
  - Backward compatible (no public API changes)

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

Commit messages:
 - 8371903: Preserve error code and debug data from HTTP/2 GOAWAY frames

Changes: https://git.openjdk.org/jdk/pull/28632/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=28632&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8371903
  Stats: 292 lines in 4 files changed: 290 ins; 0 del; 2 mod
  Patch: https://git.openjdk.org/jdk/pull/28632.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28632/head:pull/28632

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

Reply via email to