-
Bug
-
Resolution: Fixed
-
P3
-
13, 17, 20, 21
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-8324692 | 21.0.4-oracle | Weibing Xiao | P3 | Resolved | Fixed | b01 |
JDK-8327367 | 21.0.4 | Goetz Lindenmaier | P3 | Resolved | Fixed | b01 |
JDK-8324693 | 17.0.12-oracle | Weibing Xiao | P3 | Resolved | Fixed | b01 |
JDK-8329506 | 17.0.12 | Sonia Zaldana Calles | P3 | Resolved | Fixed | b01 |
Oracle Linux 9
Oracle JDK 17.0.6
A DESCRIPTION OF THE PROBLEM :
When making calls using HttpClient to an endpoint which returns a 204 and no content, the jdk.internal.net.http.ResponseSubscribers.HttpResponseInputStream.available() method returns 1 instead of the expected result of 0 when called on the result.
REGRESSION : Last worked in version 11.0.18
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Execute a call against an endpoint returning a 204 and no content like this:
HttpClient client = HttpClient.newHttpClient();
HttpResponse<InputStream> resp = client.send(req, HttpResponse.BodyHandlers.ofInputStream());
try (InputStream in = resp.body()) {
int available = in.available();
if (available > 0) {
throw new RuntimeException("Received available()" + available);
}
}
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
available() should return 0.
ACTUAL -
available() returns 1. This occurs because the buffers queue within the client contains a single HeapByteBuffer with a capacity of 0.
---------- BEGIN SOURCE ----------
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
import java.net.http.*;
import com.sun.net.httpserver.HttpServer;
public class TestHttpClient {
public static void main(String... args)
throws IOException, URISyntaxException, InterruptedException {
// start a basic server that responds with 204 to all requests
InetAddress address = InetAddress.getLoopbackAddress();
InetSocketAddress socketAddress = new InetSocketAddress(address.getHostName(), 8080);
HttpServer server = HttpServer.create(socketAddress, 20);
server.createContext("/", e -> e.sendResponseHeaders(204, -1));
server.start();
// call it with a client
try {
HttpRequest req = HttpRequest.newBuilder()
.uri(new URI("http", null, address.getHostName(), 8080, null, null, null)).GET().build();
HttpClient client = HttpClient.newHttpClient();
HttpResponse<InputStream> resp = client.send(req, HttpResponse.BodyHandlers.ofInputStream());
try (InputStream in = resp.body()) {
int available = in.available();
if (available > 0) {
throw new RuntimeException("Received available()" + available);
}
}
}
finally {
server.stop(0);
}
}
}
---------- END SOURCE ----------
FREQUENCY : always
- backported by
-
JDK-8324692 HttpResponseInputStream.available() returns 1 on empty stream
-
- Resolved
-
-
JDK-8324693 HttpResponseInputStream.available() returns 1 on empty stream
-
- Resolved
-
-
JDK-8327367 HttpResponseInputStream.available() returns 1 on empty stream
-
- Resolved
-
-
JDK-8329506 HttpResponseInputStream.available() returns 1 on empty stream
-
- Resolved
-
- links to
-
Commit openjdk/jdk17u-dev/08debe83
-
Commit openjdk/jdk21u-dev/4244cb0d
-
Commit openjdk/jdk/acaab6fd
-
Review openjdk/jdk17u-dev/2263
-
Review openjdk/jdk21u-dev/309
-
Review openjdk/jdk/14810