On Sat, 5 Dec 2020 04:54:27 GMT, Yasumasa Suenaga <[email protected]> wrote:
>> `InputStream` from `BodyPublishers.ofInputStream()` is usually closed when
>> the stream reaches EOF. However IOE handler returns without closing.
>>
>> I confirmed this problem in `BodyPublishers.ofInputStream()`, but I think
>> `BodyPublishers.ofFile()`has same problem because it also use
>> `StreamIterator`as well as `ofInputStream()`.
>>
>>
>> # How to reproduce:
>>
>> Following code (Test.java) attempts to post body from `TestInputStream`
>> which throws IOE in `read()`. "close called" is shown on the console if
>> `close()` is called.
>>
>> import java.io.*;
>> import java.net.*;
>> import java.net.http.*;
>>
>> public class Test{
>>
>> private static class TestInputStream extends InputStream{
>>
>> public TestInputStream(){
>> super();
>> System.out.println("test c'tor");
>> }
>>
>> @Override
>> public int read() throws IOException{
>> System.out.println("read called");
>> throw new IOException("test");
>> }
>>
>> @Override
>> public void close() throws IOException{
>> System.out.println("close called");
>> super.close();
>> }
>>
>> }
>>
>> public static void main(String[] args) throws Exception{
>> var http = HttpClient.newHttpClient();
>> var request = HttpRequest.newBuilder()
>> .uri(URI.create("http://httpbin.org/post"))
>>
>> .POST(HttpRequest.BodyPublishers.ofInputStream(() -> new TestInputStream()))
>> .build();
>> http.send(request, HttpResponse.BodyHandlers.discarding());
>> System.out.println("Press any key to exit...");
>> System.in.read();
>> }
>> }
>
> Yasumasa Suenaga has updated the pull request incrementally with one
> additional commit since the last revision:
>
> Throw UIOE when stream throws IOE
test/jdk/java/net/httpclient/StreamCloseTest.java line 37:
> 35: * @compile ../../../com/sun/net/httpserver/FileServerHandler.java
> 36: * @build jdk.test.lib.net.SimpleSSLContext
> 37: * @build LightWeightHttpServer
It would be preferable to avoid the use of LightWeightHttpServer in this test.
The server-side seems trivial enough to implement locally in the test.
-------------
PR: https://git.openjdk.java.net/jdk/pull/1614