test/jdk/java/net/httpclient/Response204.java
changeset 53700 4ce47bc1fb92
parent 52196 420445d16008
child 53701 e57bcfd7bf79
equal deleted inserted replaced
53698:68ca8b201925 53700:4ce47bc1fb92
    21  * questions.
    21  * questions.
    22  */
    22  */
    23 
    23 
    24 /**
    24 /**
    25  * @test
    25  * @test
    26  * @bug 8211437
    26  * @bug 8211437 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.net.http.HttpResponse.BodyHandlers;
    36 import java.util.*;
    37 import java.util.*;
    37 import java.util.concurrent.*;
    38 import java.util.concurrent.*;
    38 import java.util.logging.*;
    39 import java.util.logging.*;
    39 import java.io.*;
    40 import java.io.*;
    40 import java.net.*;
    41 import java.net.*;
       
    42 import static java.net.http.HttpClient.Builder.NO_PROXY;
    41 
    43 
    42 /**
    44 /**
    43  * 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
    44  */
    46  */
    45 public class Response204 {
    47 public class Response204 {
    52         logger.setLevel (Level.WARNING);
    54         logger.setLevel (Level.WARNING);
    53         Handler handler = new Handler();
    55         Handler handler = new Handler();
    54         InetSocketAddress addr = new InetSocketAddress (0);
    56         InetSocketAddress addr = new InetSocketAddress (0);
    55         HttpServer server = HttpServer.create (addr, 0);
    57         HttpServer server = HttpServer.create (addr, 0);
    56         HttpContext ctx = server.createContext ("/test", handler);
    58         HttpContext ctx = server.createContext ("/test", handler);
       
    59         server.createContext ("/zero", new ZeroContentLengthHandler());
    57         ExecutorService executor = Executors.newCachedThreadPool();
    60         ExecutorService executor = Executors.newCachedThreadPool();
    58         server.setExecutor (executor);
    61         server.setExecutor (executor);
    59         server.start ();
    62         server.start ();
    60 
    63 
    61         URI uri = new URI("http://localhost:"+server.getAddress().getPort()+"/test/foo.html");
    64         URI uri = new URI("http://localhost:"+server.getAddress().getPort()+"/test/foo.html");
    78                 response = client.send(request, HttpResponse.BodyHandlers.ofString());
    81                 response = client.send(request, HttpResponse.BodyHandlers.ofString());
    79                 throw new RuntimeException("send should have thrown exception");
    82                 throw new RuntimeException("send should have thrown exception");
    80             } catch (IOException ioe) {
    83             } catch (IOException ioe) {
    81                 System.out.println("OK 2");
    84                 System.out.println("OK 2");
    82             }
    85             }
       
    86 
       
    87             // Test 3
       
    88             testZeroContentLength(uri.resolve("/zero/xxyy"));
       
    89             System.out.println ("OK 3");
    83         } finally {
    90         } finally {
    84             server.stop(2);
    91             server.stop(2);
    85             executor.shutdown();
    92             executor.shutdown();
    86         }
    93         }
       
    94     }
       
    95 
       
    96     static void testZeroContentLength(URI uri) throws Exception {
       
    97         System.out.println("--- testZeroContentLength ---");
       
    98         HttpClient client = HttpClient.newBuilder().proxy(NO_PROXY).build();
       
    99         HttpRequest request = HttpRequest.newBuilder(uri).build();
       
   100         HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
       
   101         System.out.println("Received response:" + response);
       
   102         System.out.println("Received headers:" + response.headers());
       
   103         if (response.statusCode() != 204)
       
   104             throw new RuntimeException("Expected 204, got:" + response.statusCode());
       
   105         if (response.body() != null && !response.body().equals(""))
       
   106             throw new RuntimeException("Expected empty response, got: " + response.body());
       
   107         if (response.headers().firstValueAsLong("Content-Length").orElse(-1L) != 0L)
       
   108             throw new RuntimeException("Expected Content-Length:0, in: " + response.headers());
    87     }
   109     }
    88 
   110 
    89     public static boolean error = false;
   111     public static boolean error = false;
    90 
   112 
    91     static class Handler implements HttpHandler {
   113     static class Handler implements HttpHandler {
   104             }
   126             }
   105             t.sendResponseHeaders(204, -1);
   127             t.sendResponseHeaders(204, -1);
   106             t.close();
   128             t.close();
   107         }
   129         }
   108     }
   130     }
       
   131 
       
   132     // A handler that returns a 204 with a `Content-Length: 0` header/value
       
   133     static class ZeroContentLengthHandler implements HttpHandler {
       
   134         public void handle(HttpExchange t) throws IOException {
       
   135             try (InputStream is = t.getRequestBody()) {
       
   136                 is.readAllBytes();
       
   137             }
       
   138             t.getResponseHeaders().set("Content-length", "0");
       
   139             t.sendResponseHeaders(204, -1);
       
   140             t.close();
       
   141         }
       
   142     }
   109 }
   143 }