Как настроить заголовок "host" в Java http клиенте
Вот мой код:
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.BodyHandler.asString());
В результате я вижу, что вышеприведенный код отправляет:
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
заголовки или исключение).
РЕДАКТИРОВАТЬ: я сообщил об ошибке JDK.
РЕДАКТИРОВАТЬ 2: И еще одна проблема, я хотел бы переопределить также "Происхождение", но опять же он ограничен. Я не могу отредактировать сообщенную ошибку JDK, но, возможно, кто-то может добавить: "Не ограничивайте никакие заголовки, просто регистрируйте, что один переопределяет запрещенный, но разрешите его. Или добавьте другой метод disabledHeader() для их добавления". - это значительно повысит удобство использования данного клиента.
1 ответ
Поведение из клиентского кода Java11 кажется правильным. Хост раздел подробно описывает детали. Кстати, из документации 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.
Начиная с Java 12 (EA build 22) это было решено дополнительным свойством jdk.httpclient.allowRestrictedHeaders
(см. https://bugs.openjdk.java.net/browse/JDK-8213696).
Так что теперь можно переопределить Host
(или любой другой ограниченный заголовок), выполнив код с помощью:
java -Djdk.httpclient.allowRestrictedHeaders=host ...