RFR: 8371903: HttpClient: improve handling of HTTP/2 GOAWAY frames with error code [v7]
Daniel Fuchs
dfuchs at openjdk.org
Thu Dec 11 12:20:58 UTC 2025
On Thu, 11 Dec 2025 12:11:46 GMT, Jaikiran Pai <jpai at openjdk.org> wrote:
>> EunHyunsu has updated the pull request incrementally with one additional commit since the last revision:
>>
>> 8371903: Use Utils.adjustTimeout() in GoAwayWithErrorTest
>
> src/java.net.http/share/classes/jdk/internal/net/http/Http2Connection.java line 1473:
>
>> 1471: numUnprocessed.incrementAndGet();
>> 1472: } else {
>> 1473: stream.connectionClosing(cause.getCloseCause());
>
> Hello @ehs208, I think this should be done a bit differently. Here we are merely constructing a `TerminationCause` and then closing the streams with that termination cause. But that doesn't guarantee that the connection will have been closed with this termination cause. I think what we should do here is merely mark the unprocessed streams with closeAsUnprocessed() and then just call `close(Http2TerminationCause.forH2Error(errorCode, errorMsg);`. The implementation of the `Http2Connection.Terminator.doTerminate()` already has the necessary logic to close all these (processed) streams with the termination cause. So I think this code should look something like:
>
> final byte[] debugData = frame.getDebugData();
> final String debugInfo = debugData.length > 0
> ? new String(debugData, UTF_8)
> : "";
>
> ...
>
> streams.forEach((id, stream) -> {
> if (id > lastProcessedStream) {
> stream.closeAsUnprocessed();
> numUnprocessed.incrementAndGet();
> }
> });
> ...
> // closes the connection as well as the rest of the (processed) streams
> close(Http2TerminationCause.forH2Error(errorCode, errorMsg));
>
> I haven't tested this myself.
@jaikiran won't the code at line 1483 below (`close(cause)`) ensure that the connection is actually closed?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28632#discussion_r2610366237
More information about the net-dev
mailing list