13

これが私のコードです:

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 つのヘッダー (URI からのヘッダーと指定したヘッダー) を送信しますが、URI からのヘッダーではなく、指定したヘッダーHostを送信したいと考えています。Hostこのクライアントで可能ですか?

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

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

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

私も試してみましたがsetHeader、まったく同じ問題が発生しました(ダブルHostヘッダーまたは例外のいずれか)。

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

4

2 に答える 2

11

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

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

于 2018-12-04T16:06:05.823 に答える