HttpURLConnection で Hostヘッダを変更する方法

HttpURLConnection で Hostヘッダを変更する方法 技術ネタ

Java の HttpURLConnection を使ってHTTP通信をする際に、Hostヘッダの書き換えたかったのですが、少々手こずったので、そのやり方について書きたいと思います。



前提

本説明は以下の環境を前提としています。

  • JDK : 1.8.0_201

単純に setRequestProperty で設定

リクエストヘッダの設定は HttpURLConnection の setRequestMethod で可能なため、以下のコードでHostヘッダを設定したところ、なぜか変更されませんでした

URL url = new URL("http://localhost:8080/host/");

HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("GET");

http.setRequestProperty("Host", "example.com");

http.connect();

setRequestProperty で書き換える方法

どうやら、setRequestProperty で書き換えられないのは、セキュリティ的(?)にダメなようです。

もう少し調べたところ、JVMに以下のオプションを指定することで変更可能になるとのこと。

-Dsun.net.http.allowRestrictedHeaders=true

早速JVMに設定し、先程のコードを実行したところ、問題なくHostヘッダが書き換えられていました。

System.setPropertyではダメ

調べている中で、JVMオプション以外にも、以下のコードでうまくいくようなことが書かれたサイトもありましたが、私の環境では上手くいきませんでした。
もしかしたら、JDKの種類によるのかもしれません。

System.setProperty("sun.net.http.allowRestrictedHeaders", "true");

最後に

Hostヘッダの書換くらいすぐ出来るだろう、と思っていたのですが、ちょっとハマりました。
もし同じように困った方がいたら参考にしてください。