- 
    Type:
Bug
 - 
    Resolution: Fixed
 - 
    Priority:
  P3                     
     - 
    Affects Version/s: 13, 17, 20, 21
 - 
    Component/s: core-libs
 
| 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