> ### 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)
EunHyunsu has updated the pull request incrementally with one additional commit since the last revision: 8371903: Use Utils.adjustTimeout() in GoAwayWithErrorTest ------------- Changes: - all: https://git.openjdk.org/jdk/pull/28632/files - new: https://git.openjdk.org/jdk/pull/28632/files/112db211..6068c1f9 Webrevs: - full: https://webrevs.openjdk.org/?repo=jdk&pr=28632&range=06 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28632&range=05-06 Stats: 3 lines in 1 file changed: 1 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
