`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();
}
}
```
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();
}
}
```
- duplicates
-
JDK-8229703 HttpRequest.BodyPublishers.ofInputStream treats IOException as EOF
-
- Closed
-