This commit is contained in:
Chris Hegarty 2019-02-08 13:07:44 +00:00
commit ac5daa7a22
2 changed files with 36 additions and 3 deletions

View file

@ -259,7 +259,7 @@ class MultiExchange<T> {
private boolean bodyIsPresent(Response r) { private boolean bodyIsPresent(Response r) {
HttpHeaders headers = r.headers(); HttpHeaders headers = r.headers();
if (headers.firstValue("Content-length").isPresent()) if (headers.firstValueAsLong("Content-length").orElse(0L) != 0L)
return true; return true;
if (headers.firstValue("Transfer-encoding").isPresent()) if (headers.firstValue("Transfer-encoding").isPresent())
return true; return true;

View file

@ -23,7 +23,7 @@
/** /**
* @test * @test
* @bug 8211437 8216974 * @bug 8211437 8216974 8218662
* @run main/othervm -Djdk.httpclient.HttpClient.log=headers,requests Response204 * @run main/othervm -Djdk.httpclient.HttpClient.log=headers,requests Response204
* @summary * @summary
*/ */
@ -33,12 +33,13 @@ import com.sun.net.httpserver.*;
import java.net.http.HttpClient; import java.net.http.HttpClient;
import java.net.http.HttpRequest; import java.net.http.HttpRequest;
import java.net.http.HttpResponse; import java.net.http.HttpResponse;
import java.util.*; import java.net.http.HttpResponse.BodyHandlers;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.*; import java.util.logging.*;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import static java.net.http.HttpClient.Builder.NO_PROXY;
/** /**
* Verify that a 204 response code with no content-length is handled correctly * Verify that a 204 response code with no content-length is handled correctly
@ -58,6 +59,7 @@ public class Response204 {
InetSocketAddress addr = new InetSocketAddress (InetAddress.getLoopbackAddress(), 0); InetSocketAddress addr = new InetSocketAddress (InetAddress.getLoopbackAddress(), 0);
HttpServer server = HttpServer.create (addr, 0); HttpServer server = HttpServer.create (addr, 0);
HttpContext ctx = server.createContext ("/test", handler); HttpContext ctx = server.createContext ("/test", handler);
server.createContext ("/zero", new ZeroContentLengthHandler());
ExecutorService executor = Executors.newCachedThreadPool(); ExecutorService executor = Executors.newCachedThreadPool();
server.setExecutor (executor); server.setExecutor (executor);
server.start (); server.start ();
@ -91,12 +93,31 @@ public class Response204 {
// check for 8216974 // check for 8216974
Exception error = serverError.get(); Exception error = serverError.get();
if (error != null) throw error; if (error != null) throw error;
// Test 3
testZeroContentLength(uri.resolve("/zero/xxyy"));
System.out.println ("OK 3");
} finally { } finally {
server.stop(2); server.stop(2);
executor.shutdown(); executor.shutdown();
} }
} }
static void testZeroContentLength(URI uri) throws Exception {
System.out.println("--- testZeroContentLength ---");
HttpClient client = HttpClient.newBuilder().proxy(NO_PROXY).build();
HttpRequest request = HttpRequest.newBuilder(uri).build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println("Received response:" + response);
System.out.println("Received headers:" + response.headers());
if (response.statusCode() != 204)
throw new RuntimeException("Expected 204, got:" + response.statusCode());
if (response.body() != null && !response.body().equals(""))
throw new RuntimeException("Expected empty response, got: " + response.body());
if (response.headers().firstValueAsLong("Content-Length").orElse(-1L) != 0L)
throw new RuntimeException("Expected Content-Length:0, in: " + response.headers());
}
public static boolean error = false; public static boolean error = false;
static class Handler implements HttpHandler { static class Handler implements HttpHandler {
@ -133,4 +154,16 @@ public class Response204 {
t.close(); t.close();
} }
} }
// A handler that returns a 204 with a `Content-Length: 0` header/value
static class ZeroContentLengthHandler implements HttpHandler {
public void handle(HttpExchange t) throws IOException {
try (InputStream is = t.getRequestBody()) {
is.readAllBytes();
}
t.getResponseHeaders().set("Content-length", "0");
t.sendResponseHeaders(204, -1);
t.close();
}
}
} }