RFR [12] 8211437: java.net.http.HttpClient hangs on 204 reply without Content-length 0
Daniel Fuchs
daniel.fuchs at oracle.com
Thu Oct 18 15:01:29 UTC 2018
Hi Michael,
Thanks for taking on all the feedback!
MultiExchange.java:
254 if (bodyIsPresent(r)) {
255 IOException ioe = new IOException(
256 "unexpected content length header with 204 response");
257 exch.cancel();
258 return MinimalFuture.failedFuture(ioe);
I believe it would be more correct to call
exch.cancel(ioe);
at line 257 above...
In Response204.java:
48 Logger logger = Logger.getLogger ("com.sun.net.httpserver");
49 ConsoleHandler c = new ConsoleHandler();
50 c.setLevel (Level.WARNING);
51 logger.addHandler (c);
52 logger.setLevel (Level.WARNING);
Not that it matters much, but that is strange - I'd understand
if both Logger and ConsoleHandler were set to something below
INFO - like e.g. FINE, FINER, FINEST, or ALL?
Otherwise looks good.
IIUC Response204 tests HTTP/1.1 and NoBodyTest tests
HTTP/2.
Probably not worth it to have a test that tests all 4 flavors
of HTTP/1.1, HTTPS/1.1, HTTP/2, HTTPS/2 ?
best regards,
-- daniel
On 18/10/2018 14:58, Michael McMahon wrote:
> Updated webrev for this at
> http://cr.openjdk.java.net/~michaelm/8211437/webrev.2/index.html
> based on feedback below.
>
> I also made a change to the com.sun httpserver. It changes the recent
> fix related to the same
> issue such that by default the server will not send a content-length
> back, if the user explicitly
> sets one, then it will be sent. This is useful for testing this fix here.
>
> Thanks,
>
> Michael
>
> On 15/10/2018, 16:07, Michael McMahon wrote:
>> Hi Daniel,
>>
>> On 15/10/2018, 12:53, Daniel Fuchs wrote:
>>> Hi Michael,
>>>
>>> On 15/10/2018 11:54, Michael McMahon wrote:
>>>> Could I get the following fix reviewed please.
>>>>
>>>> http://cr.openjdk.java.net/~michaelm/8211437/webrev.1/index.html
>>>
>>> Looks good in general.
>>>
>>> In MultiExchange.java:
>>>
>>> 236 T nullBody = cf.get();
>>>
>>> Though technically the body should be available by the
>>> time we reach this line, since you completed the subscriber
>>> just before, we can't really make any assumption on the
>>> implementation of the subscriber.
>>>
>>> So for the sake of robustness we should probably use
>>> getBody().handle(...) to complete `result`
>>> rather than calling cf.get();
>>>
>>
>> Yes, that would be better.
>>
>>>
>>> Also I wonder what should happen if a body is present:
>>>
>>> Should we simply read it instead?
>>> Because if we don't then we should close the connection (HTTP/1.1)
>>> or reset the stream (HTTP/2) - which probably means getting back
>>> to the concrete exchange implementation to make sure that
>>> happens.
>>>
>>
>> I see that as a protocol error. So, rather than attempting to read the
>> body, I think we should ensure that the request fails (which it does
>> if a content length or transfer encoding field is present). The
>> connection
>> also needs to be closed (or stream reset) which I need to check is
>> being done.
>>
>> Thanks,
>> Michael
>>
>>> best regards,
>>>
>>> -- daniel
>>>
>>>>
>>>> Thanks,
>>>>
>>>> Michael.
>>>
More information about the net-dev
mailing list