equal
deleted
inserted
replaced
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 } |