On Thu, 9 Jun 2022 11:27:47 GMT, Conor Cleary <ccle...@openjdk.org> wrote:

>> **Issue**
>> It was observed that when the httpclient sends a POST request with the 
>> `Expect: 100 Continue` header set and the server replies with a response 
>> code `417 Expectation Failed` that the httpclient hangs indefinitely when 
>> the version of Http used is HTTP/2. However, it was also seen that the issue 
>> persisted with HTTP/1_1 with the same usage.
>> 
>> This was caused by an implementation in ExchangeImpl that resulted in two 
>> calls to readBodyAsync() in this case, where the second call causes the 
>> indefinite hanging (as if there was a respomse body, it has already been 
>> read).
>> 
>> **Solution**
>> When ExchangeImpl::expectContinue() detects that a response code 417 is 
>> received, two things occur. Firstly, a flag is set which ensures that the 
>> connection is closed locally in this case. Secondly, the response is 
>> returned to the client as a failed future, A unit test was added to ensure 
>> that this usage of the httpclient does not cause hanging.
>
> Conor Cleary has updated the pull request incrementally with two additional 
> commits since the last revision:
> 
>  - 8286171: Package-protected access for method
>  - 8286171: Added checks for correct response codes

test/jdk/java/net/httpclient/ExpectContinueTest.java line 102:

> 100:         // Due to limitations of the above Http1 Server, a manual 
> approach is taken to test the hanging with the
> 101:         // httpclient using Http1 so that the correct response header 
> can be returned for the test case
> 102:         http1HangServer = new Http1HangServer(saHang);

It took me a while to understand why we have special server implementation for 
this. The comment helped :) It reminded me about the `ServerImpl` used by the 
`HttpServer`, which unconditionally sends a `100` response code when it sees a 
`Expect: 100-continue` in the request header.

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

PR: https://git.openjdk.java.net/jdk/pull/9093

Reply via email to