Как настроить заголовок «host» в Java-клиенте http - PullRequest
0 голосов
/ 13 сентября 2018

Вот мой код:

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());

В результате я вижу, что вышеприведенный код отправляет:

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

Как вы можете видеть, он отправляет два заголовка Host (один из URI и тот, который я указал), но я хотел бы, чтобы он отправил указанный мной заголовок Host, а не тот из URI. Возможно ли с этим клиентом?

РЕДАКТИРОВАТЬ: В Java 11, это становится еще хуже (вам нужно изменить строку client.send на: client.send(request, HttpResponse.BodyHandlers.ofString());):

java.lang.IllegalArgumentException: restricted header name: "Host"

Как мне настроить этот заголовок (необходимый для тестирования виртуальных хостов)?

Я также попробовал setHeader и получил точно такую ​​же проблему (либо двойные Host заголовки, либо исключение).

EDIT: я сообщил об ошибке JDK .

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Начиная с Java 12 (сборка EA 22) это было решено дополнительным свойством jdk.httpclient.allowRestrictedHeaders (см. https://bugs.openjdk.java.net/browse/JDK-8213696).

Так что теперь можно переопределить Host (или любой другой ограниченный заголовок), выполнивкод с: java -Djdk.httpclient.allowRestrictedHeaders=host ...

0 голосов
/ 13 сентября 2018

Поведение из клиентского кода Java11 кажется правильным. Раздел Host подробно описывает детали. Кстати, из документации HttpRequest строитель header(String name, String value):

*    @throws IllegalArgumentException if the header name or value is not
*    valid, see <a href="https://tools.ietf.org/html/rfc7230#section-3.2">
*    RFC 7230 section-3.2</a>, or the header name or value is restricted
*    by the implementation.

Обновление : См. Ответ , относящийся к JDK / 12 .

...