test/jdk/java/net/httpclient/Response204.java
changeset 53701 e57bcfd7bf79
parent 53524 90865744493d
parent 53700 4ce47bc1fb92
equal deleted inserted replaced
53699:e402ec38ba9a 53701:e57bcfd7bf79
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 
    23 
    24 /**
    24 /**
    25  * @test
    25  * @test
    26  * @bug 8211437 8216974
    26  * @bug 8211437 8216974 8218662
    27  * @run main/othervm -Djdk.httpclient.HttpClient.log=headers,requests Response204
    27  * @run main/othervm -Djdk.httpclient.HttpClient.log=headers,requests Response204
    28  * @summary
    28  * @summary
    29  */
    29  */
    30 
    30 
    31 import com.sun.net.httpserver.*;
    31 import com.sun.net.httpserver.*;
    32 
    32 
    33 import java.net.http.HttpClient;
    33 import java.net.http.HttpClient;
    34 import java.net.http.HttpRequest;
    34 import java.net.http.HttpRequest;
    35 import java.net.http.HttpResponse;
    35 import java.net.http.HttpResponse;
    36 import java.util.*;
    36 import java.net.http.HttpResponse.BodyHandlers;
    37 import java.util.concurrent.*;
    37 import java.util.concurrent.*;
    38 import java.util.concurrent.atomic.AtomicReference;
    38 import java.util.concurrent.atomic.AtomicReference;
    39 import java.util.logging.*;
    39 import java.util.logging.*;
    40 import java.io.*;
    40 import java.io.*;
    41 import java.net.*;
    41 import java.net.*;
       
    42 import static java.net.http.HttpClient.Builder.NO_PROXY;
    42 
    43 
    43 /**
    44 /**
    44  * Verify that a 204 response code with no content-length is handled correctly
    45  * Verify that a 204 response code with no content-length is handled correctly
    45  */
    46  */
    46 public class Response204 {
    47 public class Response204 {
    56         logger.setLevel (Level.WARNING);
    57         logger.setLevel (Level.WARNING);
    57         Handler handler = new Handler();
    58         Handler handler = new Handler();
    58         InetSocketAddress addr = new InetSocketAddress (InetAddress.getLoopbackAddress(), 0);
    59         InetSocketAddress addr = new InetSocketAddress (InetAddress.getLoopbackAddress(), 0);
    59         HttpServer server = HttpServer.create (addr, 0);
    60         HttpServer server = HttpServer.create (addr, 0);
    60         HttpContext ctx = server.createContext ("/test", handler);
    61         HttpContext ctx = server.createContext ("/test", handler);
       
    62         server.createContext ("/zero", new ZeroContentLengthHandler());
    61         ExecutorService executor = Executors.newCachedThreadPool();
    63         ExecutorService executor = Executors.newCachedThreadPool();
    62         server.setExecutor (executor);
    64         server.setExecutor (executor);
    63         server.start ();
    65         server.start ();
    64 
    66 
    65         URI uri = new URI("http", null,
    67         URI uri = new URI("http", null,
    89             }
    91             }
    90 
    92 
    91             // check for 8216974
    93             // check for 8216974
    92             Exception error = serverError.get();
    94             Exception error = serverError.get();
    93             if (error != null) throw error;
    95             if (error != null) throw error;
       
    96 
       
    97             // Test 3
       
    98             testZeroContentLength(uri.resolve("/zero/xxyy"));
       
    99             System.out.println ("OK 3");
    94         } finally {
   100         } finally {
    95             server.stop(2);
   101             server.stop(2);
    96             executor.shutdown();
   102             executor.shutdown();
    97         }
   103         }
       
   104     }
       
   105 
       
   106     static void testZeroContentLength(URI uri) throws Exception {
       
   107         System.out.println("--- testZeroContentLength ---");
       
   108         HttpClient client = HttpClient.newBuilder().proxy(NO_PROXY).build();
       
   109         HttpRequest request = HttpRequest.newBuilder(uri).build();
       
   110         HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
       
   111         System.out.println("Received response:" + response);
       
   112         System.out.println("Received headers:" + response.headers());
       
   113         if (response.statusCode() != 204)
       
   114             throw new RuntimeException("Expected 204, got:" + response.statusCode());
       
   115         if (response.body() != null && !response.body().equals(""))
       
   116             throw new RuntimeException("Expected empty response, got: " + response.body());
       
   117         if (response.headers().firstValueAsLong("Content-Length").orElse(-1L) != 0L)
       
   118             throw new RuntimeException("Expected Content-Length:0, in: " + response.headers());
    98     }
   119     }
    99 
   120 
   100     public static boolean error = false;
   121     public static boolean error = false;
   101 
   122 
   102     static class Handler implements HttpHandler {
   123     static class Handler implements HttpHandler {
   131             }
   152             }
   132             t.sendResponseHeaders(204, -1);
   153             t.sendResponseHeaders(204, -1);
   133             t.close();
   154             t.close();
   134         }
   155         }
   135     }
   156     }
       
   157 
       
   158     // A handler that returns a 204 with a `Content-Length: 0` header/value
       
   159     static class ZeroContentLengthHandler implements HttpHandler {
       
   160         public void handle(HttpExchange t) throws IOException {
       
   161             try (InputStream is = t.getRequestBody()) {
       
   162                 is.readAllBytes();
       
   163             }
       
   164             t.getResponseHeaders().set("Content-length", "0");
       
   165             t.sendResponseHeaders(204, -1);
       
   166             t.close();
       
   167         }
       
   168     }
   136 }
   169 }