web-dev-qa-db-ja.com

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.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
_

ご覧のとおり、2つのHostヘッダー(URIからのものと指定したもの)を送信しますが、指定したHostヘッダーではなく、指定したヘッダーを送信したいと思います。 URI。このクライアントで可能ですか?

編集:Java 11では、さらに悪化します(client.send行を次のように変更する必要があります:client.send(request, HttpResponse.BodyHandlers.ofString());):

_Java.lang.IllegalArgumentException: restricted header name: "Host"
_

そのヘッダーをカスタマイズするにはどうすればよいですか(仮想ホストのテストに必要)?

また、setHeaderを試しましたが、まったく同じ問題が発生しました(二重のHostヘッダー、または例外)。

編集:私は JDKバグ を報告しました。

7

Java 12(EAビルド22)の時点で、追加のプロパティjdk.httpclient.allowRestrictedHeadersによって解決されています( https://bugs.openjdk.Java.net/browse/を参照) JDK-8213696 )。

したがって、次のコードを実行することで、Host(またはその他の制限されたヘッダー)をオーバーライドできます。Java -Djdk.httpclient.allowRestrictedHeaders=Host ...

1

Java11クライアントコードの動作は正しいようです。 Host セクションで詳細を詳しく説明します。ちなみに、HttpRequest builder 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.

Update:回答についてはこれを参照してください JDK/12に関連

3
nullpointer