これが私のコードです:
_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バグ を報告しました。
Java 12(EAビルド22)の時点で、追加のプロパティjdk.httpclient.allowRestrictedHeaders
によって解決されています( https://bugs.openjdk.Java.net/browse/を参照) JDK-8213696 )。
したがって、次のコードを実行することで、Host
(またはその他の制限されたヘッダー)をオーバーライドできます。Java -Djdk.httpclient.allowRestrictedHeaders=Host ...
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に関連 。