プラグイン作って覚えたことを淡々と記録するよ(HTTPプロキシ編)

Jar JugglerやMaven Repo Searchをファイアウォール内で使う場合は,idea.exe.vmoptionsにプロキシの設定をしとかないとダメって言ってたけど,それは単なる勘違いだったことが判明。ただ単にIDEAの流儀に従ってなかったのがコケる理由だったようだ。


事の発端は,IDEAのSettings→Generalに設定したプロキシの値を抜けないか調べてみたことに始まる。


調べりゃ意外と簡単で,SDKのcom.intellij.util.netにHttpConfigurableっていかにもなクラスがあるではないか。しかもご丁寧に,インスタンス取得メソッドまであるし。
"〜Configurable"の名前から推測できるように,設定内容を保持するパブリックフィールドが揃っておる。なんでま,IDEAに設定したプロキシの値を抜きたいのなら,こんなコードを書けばいい。

HttpConfigurable httpConfig = HttpConfigurable.getInstance();
boolean useProxy = httpConfig.USE_HTTP_PROXY;
String proxyHost = httpConfig.PROXY_HOST;
int proxyPort = httpConfig.PROXY_PORT;

boolean useAuthentication = httpConfig.PROXY_AUTHENTICATION;
String loginUser = httpConfig.PROXY_LOGIN;
String loginPassword = httpConfig.PROXY_PASSWORD_CRYPT;  // 暗号化してる

これを元ネタにシステムプロパティに転記しようかなって思ったら,こんなメソッドをハケーン。

  // @todo [all] Call this function before every HTTP connection.
  /**
   * Call this function before every HTTP connection.
   * If system configured to use HTTP proxy, this function
   * checks all required parameters and ask password if
   * required.
   * @param url URL for HTTP connection
   * @throws IOException
   */
  public void prepareURL (String url) throws IOException;

よーするにだ,HTTPコネクション張るときは,事前に prepareURL() を呼べっちゅうワケだな。さらに,このメソッド内でプロキシへの認証(setAuthenticator())も行っており,ちゃっかりシステムプロパティへの転記もしておりましたとさ。


これを見よ。

public void setAuthenticator() {
  if (USE_HTTP_PROXY) {
    System.setProperty("proxySet", "true");
    System.setProperty("http.proxyHost", PROXY_HOST);
    System.setProperty("http.proxyPort", Integer.toString (PROXY_PORT));
    Authenticator.setDefault(getAuthenticator());
  } else {
    System.setProperty("proxySet", "false");
    Authenticator.setDefault(null);
  }
}


プロキシにパスワード認証が必要な場合は,その入力を促すダイアログがでるっぽいんで,なおのことこのメソッドを使った方がいいようだの。
うーむ,IDEA,あなどりがたしだ。...つーか,知らんよ,そんなの。:-P