Loading... (original) (raw)

A DESCRIPTION OF THE PROBLEM :
According to RFC 7230, a 204 reply should not have Content-length header:

"A server MUST NOT send a Content-Length header field in any response with a status code of 1xx (Informational) or 204 (No Content)."

However, if no such header is present on a 204 reply, an HTTP request made with java.net.http.HttpClient will hang waiting for more content.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
1 - Create a webserver that replies with HTTP status code 204 and does not set the Content-length header to 0 (following the RFC).

2 - Use java.net.http.HttpClient to request a resource from such server.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Obtain a valid response.
ACTUAL -
Client hangs waiting for more content to read.

---------- BEGIN SOURCE ----------
I've used Spark Java (sparkjava.com) for the webserver as com.sun.net.httpserver.HttpServer does not conform with the RFC and always returns the Content-length (reported in another issue).

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse.BodyHandlers;

import static spark.Spark.*;

public class TestClient {

public static void main(String[] args) throws IOException, InterruptedException {
port(8000);
get("/", (req, res) -> {
res.status(204);
return "";
});

awaitInitialization();

var request = HttpRequest.newBuilder()
.uri(URI.create("http://localhost:8000/"))
.GET()
.build();

final var res = HttpClient.newHttpClient().send(request, BodyHandlers.ofString());
System.out.println(res.statusCode());

stop();
awaitStop();
}
}
---------- END SOURCE ----------

FREQUENCY : always