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 } |