Quantcast
Channel: プログラム の個人的なメモ
Viewing all articles
Browse latest Browse all 860

【Java】プロキシ設定のチェック機能を考える

$
0
0

■ はじめに

プロキシ設定のチェックを以下の関連記事であるようなコードで試してみた。
https://blogs.yahoo.co.jp/dk521123/37019179.html
しかし、Basic認証が設定してあるプロキシサーバで
「Basic認証が認証が通った後に、認証NGになる設定をおこなった際に
前回のBasic認証が通っているのでエラーにならない」という問題が出た。
サーバに細工をし、「HTTPコード 407(プロキシ認証が必要)」を返せば
ログアウト的なことをできるらしいができればアプリだけで完結したいので
そのやり方を考える

■ サンプル

以下の環境下を想定する

 * プロキシサーバ   :192.168.211.123
 * プロキシサーバポート:3128
 * 認証ID       :admin
 * 認証パスワード   :password

ProxySettingChecker.java

別プロセスとして実行したいJava。 ProxySettingChecker.jar にする
import java.io.IOException;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;
import java.net.URL;

public class ProxySettingChecker {

  private static final int TIMEOUT = 5_000;

  /**
   *
   * @param args
   *
   *          <pre>
   * args[0] : 対象URL(http://xxxx) (Required)
   * args[1] : Proxy Host (Required)
   * args[2] : Proxy Port (Required)
   * args[3] : User Name (Optional)
   * args[4] : Password (Optional)
   *          </pre>
   *
   * @throws Exception
   */
  public static void main(String[] args) throws Exception {
    if (args == null || args.length < 3) {
      throw new IllegalArgumentException("Illegal Arguments");
    }
    System.out.println("args.length : " + args.length);

    String targetUrl = args[0];
    String proxyHost = args[1];
    int proxyPort = Integer.valueOf(args[2]);

    if (args.length >= 5) {
      String userName = args[3];
      String password = args[4];
      if (userName != null && password != null) {
        System.out.println(userName + " " + password);
        Authenticator.setDefault(new Authenticator() {
          @Override
          protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(userName, password.toCharArray());
          }
        });
      }
    }

    int responseCode = ProxySettingChecker.connectUsingProxy(proxyHost, proxyPort, targetUrl, TIMEOUT);
    if (ProxySettingChecker.isValidResponse(responseCode)) {
      System.out.println("OK Setting");
      return;
    }
    System.err.println("NG Setting");
    System.exit(responseCode);
  }

  private static int connectUsingProxy(String proxyHost, int proxyPort, String url, int timeout) {
    try {
      URL targetUrl = new URL(url);
      Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
      HttpURLConnection connection = (HttpURLConnection) targetUrl.openConnection(proxy);
      connection.setConnectTimeout(timeout);
      connection.setReadTimeout(timeout);
      connection.setRequestMethod("HEAD");
      return connection.getResponseCode();
    } catch (IOException ex) {
      return -1;
    }
  }

  private static boolean isValidResponse(int responseCode) {
    return 200 <= responseCode && responseCode <= 399;
  }
}

Main.java

呼び出し側
//import java.io.BufferedReader;
//import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) {
    System.out.println("Test1-1 : OK");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-2 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "admin", "dummy");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-3 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128", "dummy", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test1-4 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3128");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test2-1 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.1", "3128", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    System.out.println("Test2-2 : NG");
    try {
      execute("java", "-jar", "ProxySettingChecker.jar", "http://www.msn.com/ja-jp","192.168.211.123", "3129", "admin", "password");
      Thread.sleep(1000L);
      System.out.println();
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);
      if (result != 0) {
        System.err.println("Error!");
      }
//      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
//        String line;
//        while ((line = bufferedReader.readLine()) != null) {
//          System.out.println(line);
//        }
//      }
//      try (BufferedReader errorBufferedreader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
//        String errorLine;
//        while ((errorLine = errorBufferedreader.readLine()) != null) {
//          System.err.println(errorLine);
//        }
//      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

Test1-1 : OK
Result Code : 0

Test1-2 : NG
Result Code : 407
Error!

Test1-3 : NG
Result Code : 407
Error!

Test1-4 : NG
Result Code : 407
Error!

Test2-1 : NG
Result Code : -1
Error!

Test2-2 : NG
Result Code : -1
Error!

関連記事

Java で ping を考える

https://blogs.yahoo.co.jp/dk521123/37019179.html

Java から別のJava(JARファイル)を実行するには...

https://blogs.yahoo.co.jp/dk521123/37181644.html

Viewing all articles
Browse latest Browse all 860

Trending Articles