RFR: 8296410: HttpClient throws java.io.IOException: no statuscode in response for HTTP2
Jaikiran Pai
jpai at openjdk.org
Wed Jan 18 09:22:30 UTC 2023
On Tue, 17 Jan 2023 10:58:54 GMT, Conor Cleary <ccleary at openjdk.org> wrote:
> ### **Description**
> With HTTP/2, a possible flow of an exchange could be that a Server responds to a simple request by sending response headers within a HEADERS frame, the requested resources and trailing headers with another HEADERS frame including the END_HEADERS and END_STREAM flags (if they were not previously given in the Response Headers). Usually an HTTP/2 client should opt-in to make use of trailing headers though this behaviour is not supoorted by default with the HttpClient.
>
> It is still possible in any case that a trailing HEADERS frame can be sent, even if the frame just carries flags and no headers specified in the header block. This edge case was causing an IOException to be thrown and the client to shut down unexpectedly.
>
> ### **Summary of Changes & Justification**
> In Stream, a means to track the state of whether or not a final status code for an exchange has been received was added to prevent the exception occuring due to a HEADERS frame with no status code arriving after response headers were received. In the case of a partial response (status codes in the 1XX range), the flag for receiving a final response code is not set until a response outside of the 1XX range is received.
>
> Lastly, if trailing headers are received, they are logged and dumped. The response headers consumer is then reset.
>
> ---------
> ### Progress
> - [ ] Change must be properly reviewed (1 review required, with at least 1 [Reviewer](https://openjdk.org/bylaws#reviewer))
> - [x] Change must not contain extraneous whitespace
> - [x] Commit message must refer to an issue
>
>
>
> ### Reviewing
> <details><summary>Using <code>git</code></summary>
>
> Checkout this PR locally: \
> `$ git fetch https://git.openjdk.org/jdk pull/12028/head:pull/12028` \
> `$ git checkout pull/12028`
>
> Update a local copy of the PR: \
> `$ git checkout pull/12028` \
> `$ git pull https://git.openjdk.org/jdk pull/12028/head`
>
> </details>
> <details><summary>Using Skara CLI tools</summary>
>
> Checkout this PR locally: \
> `$ git pr checkout 12028`
>
> View PR using the GUI difftool: \
> `$ git pr show -t 12028`
>
> </details>
> <details><summary>Using diff file</summary>
>
> Download this PR as a diff file: \
> <a href="https://git.openjdk.org/jdk/pull/12028.diff">https://git.openjdk.org/jdk/pull/12028.diff</a>
>
> </details>
The changes in this PR look good to me. While looking at the source code, I noticed that the `Stream` class has a `PushedStream` nested class which too has a similar implementation in `handleResponse()`. I haven't yet checked the spec related to this; do you know if this code too will need a similar fix?
-------------
PR: https://git.openjdk.org/jdk/pull/12028
More information about the net-dev
mailing list