RFR: 8257736: InputStream from BodyPublishers.ofInputStream() leaks when IOE happens [v3]

Chris Hegarty chegar at openjdk.java.net
Thu Dec 10 09:37:38 UTC 2020


On Sat, 5 Dec 2020 04:54:27 GMT, Yasumasa Suenaga <ysuenaga at openjdk.org> 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


More information about the net-dev mailing list