On Thu, 18 Dec 2025 18:05:37 GMT, EunHyunsu <[email protected]> wrote:

>> ### 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: Add printStackTrace() to GoAwayWithErrorTest

Option 1: we already do that 
[here](https://github.com/openjdk/jdk/blob/574efae488865a22d551b834ee82e5dcd8b31022/src/java.net.http/share/classes/jdk/internal/net/http/Http2Connection.java#L1388);
 once finalStream is set, the connection will not accept more streams. But 
there's a short window after the stream is accepted, but before it's added to 
the map.
Option 2 won't work either. For all we know, the other thread might not be 
actively running on the CPU, so the second forEach would not be enough.

We need to cooperate with the other thread that adds the stream to the map; 
maybe we could put stateLock around `streams.forEach` and `close`, assuming it 
won't deadlock anywhere.

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

PR Comment: https://git.openjdk.org/jdk/pull/28632#issuecomment-3674235247

Reply via email to