Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8306040

HttpResponseInputStream.available() returns 1 on empty stream

    XMLWordPrintable

Details

    • b06
    • 13
    • b13
    • generic
    • generic

    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


      Attachments

        Issue Links

          Activity

            People

              ccleary Conor Cleary
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: