On Sun, 3 Sep 2023 09:16:24 GMT, Vyom Tewari <[email protected]> wrote:

>> With the current implementation of HttpURLConnection  if server rejects the  
>> “Expect 100-continue” then there will be ‘java.net.ProtocolException’ will 
>> be thrown from 'expect100Continue()' method. 
>> 
>> After the exception thrown, If we call any other method on the same instance 
>> (ex getHeaderField(), or getHeaderFields()). They will internally call 
>> getOuputStream() which invokes writeRequests(), which make the actual server 
>> call.
>> 
>> The code change will sets the existing variable ‘rememberedException’ when 
>> there is exception and getOutputStream0() will re-throw 
>> ‘rememberedException’  if the ‘rememberedException’ is not null. 
>> 
>> Note: getOutputStream0() also call’s  ‘expect100Continue()’  if 
>> ‘expectContinue’ is true.
>
> Vyom Tewari has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   modified the junit tests names

> With the current implementation of HttpURLConnection if server rejects the 
> “Expect 100-continue” then there will be ‘java.net.ProtocolException’ will be 
> thrown from 'expect100Continue()' method.

Looking at the current implementation in 
`sun/net/www/protocol/http/HttpURLConnection.java`, I'm unsure if 
`expect100Continue()` is doing the right thing when compared with what the 
HTTP/1.1 RFC-9110 section 10.1.1 expects 
https://www.rfc-editor.org/rfc/rfc9110#field.expect:

> Upon receiving an HTTP/1.1 (or later) request that has a method, target URI, 
> and complete header section that contains a 100-continue expectation and an 
> indication that request content will follow, an origin server MUST send 
> either:
>
>  an immediate response with a final status code, if that status can be 
> determined by examining just the method, target URI, and header fields, or
> 
>  an immediate 100 (Continue) response to encourage the client to send the 
> request content.

which means the server is allowed to send a (final) response code like 2xx. 
However, the current implementation in `expect100Continue()` appears to 
consider it a protocol violation and throws an exception 
https://github.com/openjdk/jdk/blob/master/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java#L1362


if (responseCode != 100) {
    // responseCode will be returned to caller
    throw new ProtocolException("Server rejected operation");
}

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

PR Comment: https://git.openjdk.org/jdk/pull/15483#issuecomment-1704766176

Reply via email to