On Fri, 4 Mar 2022 14:42:40 GMT, Conor Cleary wrote:
> **Problem**
> When a Continuation Frame is received by the httpclient using HTTP/2 after a
> Push Promise frame (can happen if the amount of headers to be sent in a
> single Push Promise frame exceeds the maximum frame size, so a Continuation
> frame is required), the following exception occurs:
>
>
> java.io.IOException: no statuscode in response
> at
> java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:565)
> at
> java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)
> ...
>
> This exception occurs because there is no existing flow in
> `jdk/internal/net/http/Http2Connection.java` which accounts for the case
> where a PushPromiseFrame is received with the END_HEADERS flag set to 0x0.
> When this occurs, the only acceptable frame/s (as multiple continuations are
> also acceptable) that can be received by the client on the same stream is a
> continuation frame.
>
> **Fix**
> To ensure correct behavior, the following changes were made to
> `jdk/internal/net/http/Http2Connection.java`.
>
> - The existing method `handlePushPromise()` was modified so that if the
> END_HEADERS flag is _unset_ (flags equal to 0x0), then a record used to track
> the state of the Push Promise containing a shared `HeaderDecoder` and the
> received `PushPromiseFrame` is initialised.
> - When the subsequent `ContinuationFrame` is received in `processFrame()`,
> the method `handlePushContinuation()` is called instead of the default flow
> resulting in `stream.incoming(frame)` being called (the source of the
> incorrect behaviour originally).
> - In `handlePushContinuation()`, the shared decoder is used to decode the
> received `ContinuationFrame` headers and if the `END_HEADERS` flag is set
> (flags equal to 0x4), the `HttpHeaders` object for the Push Promise as a
> whole is constructed which serves to combine the headers from both the
> `PushPromiseFrame` and the `ContinuationFrame`.
>
> A regression test was included which verifies that the exception is not
> thrown and that the headers arrive correctly.
This pull request has now been integrated.
Changeset: 4d2cd26a
Author:Conor Cleary
Committer: Daniel Fuchs
URL:
https://git.openjdk.java.net/jdk/commit/4d2cd26ab5092ad0a169e4239164a869a4255bd3
Stats: 439 lines in 4 files changed: 397 ins; 19 del; 23 mod
8263031: HttpClient throws Exception if it receives a Push Promise that is too
large
Reviewed-by: dfuchs
-
PR: https://git.openjdk.java.net/jdk/pull/7696