On Thu, 9 Jun 2022 11:10:11 GMT, Jaikiran Pai <j...@openjdk.org> wrote:

>> Conor Cleary has updated the pull request incrementally with one additional 
>> commit since the last revision:
>> 
>>   8286171: Added teardown method and comments
>
> src/java.net.http/share/classes/jdk/internal/net/http/Http1Exchange.java line 
> 862:
> 
>> 860:             // Sets a flag which closes the connection locally when
>> 861:             // onFinished() is called
>> 862:             response.closeWhenFinished();
> 
> I checked the HTTP/1.1 spec to see what it says about the `100-Continue` 
> request/response flow. The spec (here 
> https://www.rfc-editor.org/rfc/rfc7231#section-5.1.1) from a server 
> perspective says that the server might either return a `417` or a final 
> status code (or of course `100`). A 4xx is considered a client error and I 
> think we don't close a connection on 4xx errors (I haven't looked thoroughly 
> at the code yet to verify that part). So is there a reason why we would want 
> to close a connection if the server responds with `417`? In fact, the spec 
> says this for clients:
> 
> 
> A client that receives a 417 (Expectation Failed) status code in
> response to a request containing a 100-continue expectation SHOULD
> repeat that request without a 100-continue expectation, since the
> 417 response merely indicates that the response chain does not
> support expectations (e.g., it passes through an HTTP/1.0 server).
> 
> 
> It says `SHOULD`, so it isn't mandated that we retry the request on `417`.
> 
> Furthermore, the spec states that if the server sends a final status code 
> instead of 417, then it might also send a `Connection: close` header to 
> indicate whether or not the connection should be closed:
> 
> 
> A server that responds with a final status code before reading the
> entire message body SHOULD indicate in that response whether it
> intends to close the connection or continue reading and discarding
> the request message (see Section 6.6 of [RFC7230]).
> 
> 
> Are we closing the connection irrespective of the status code (and other 
> headers) to keep the implementation simpler? If that's the reason, then I 
> think that's fine, since it still is within what the spec seems to allow. I'm 
> just curious if there's some other reason for doing this.

All good points. Yes - we could make a special case for 417 - and maybe we 
should log another issue to do that. We choose to close the connection in all 
cases here to make the implementation simpler. In practice I guess we could 
leave the connection opened - but if a server sends back anything but 100 then 
we might not be entirely sure of what state the server is in, so closing the 
connection seems safer.

> src/java.net.http/share/classes/jdk/internal/net/http/Http1Response.java line 
> 424:
> 
>> 422:     }
>> 423: 
>> 424:     public void closeWhenFinished() {
> 
> Hello Conor, do you think it might be better if we make this package private 
> access instead of `public`?

Yes - good catch!

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

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

Reply via email to