Aquí está mi código:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://127.0.0.1:8081/"))
.header("Host", "test.example.com")
.build();
client.send(request, HttpResponse.BodyHandlers.ofString());
Como resultado veo que envía el código anterior:
GET / HTTP/1.1
Connection: Upgrade, HTTP2-Settings
Content-Length: 0
Host: 127.0.0.1:8081
HTTP2-Settings: AAEAAEAAAAIAAAABAAMAAABkAAQBAAAAAAUAAEAA
Upgrade: h2c
User-Agent: Java-http-client/10
Host: test.example.com
Como se puede ver que envía dos Host
cabeceras (el de URI y la que se especifica), pero me gustaría que enviar el Host
encabezado que he especificado, no el de la URI. ¿Es posible con este cliente?
EDIT: En Java 11, se pone aún peor (es necesario cambiar la línea a client.send: client.send(request, HttpResponse.BodyHandlers.ofString());
):
java.lang.IllegalArgumentException: restricted header name: "Host"
¿Cómo puedo personalizar esa cabecera (necesarios para las pruebas de los ejércitos virtuales)?
También probé el setHeader
y obtener exactamente el mismo problema (ya sea dobles Host
cabeceras, o la excepción).
EDIT: Me informó de un error de JDK .
A partir del 12 de Java (EA build 22) se ha resuelto por propiedad adicional jdk.httpclient.allowRestrictedHeaders
(ver https://bugs.openjdk.java.net/browse/JDK-8213696 ).
Por lo que ahora se puede anular Host
(o cualquier otro encabezado restringido) mediante la ejecución del código con: java -Djdk.httpclient.allowRestrictedHeaders=host ...