Details
-
Bug
-
Status: Resolved
-
P3
-
Resolution: Fixed
-
13, 17, 20, 21
Description
ADDITIONAL SYSTEM INFORMATION :
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
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