Javaでproxy.pacを処理させる簡単な方法 その2
その1では、ブラウザからプロキシ設定を取得するコードを掲載しましたが、今回はJavaのコントロールパネルの設定を完全に読み取るコードです。
これで、プロキシの対応もバッチリ!(実は、認証付きのプロキシという、高いハードルがあるのですが、そちらはそのうち記事にしたいと思います。。。)
ソースコードはこちらから
ProxyInfoManager.java
package com.daisukeyamashita.tools.proxyinfo;
import java.net.MalformedURLException;
import java.net.URL;
import org.apache.log4j.Logger;
import com.sun.deploy.config.Config;
import com.sun.deploy.net.proxy.BrowserProxyConfig;
import com.sun.deploy.net.proxy.BrowserProxyInfo;
import com.sun.deploy.net.proxy.DynamicProxyManager;
import com.sun.deploy.net.proxy.ProxyConfigException;
import com.sun.deploy.net.proxy.ProxyHandler;
import com.sun.deploy.net.proxy.ProxyUnavailableException;
import com.sun.deploy.services.ServiceManager;
public class ProxyInfoManager {
private static final Logger logger = Logger.getLogger(ProxyInfoManager.class);
private static final String CHECK_URL = "http://www.適当なホストを指定.com"; //$NON-NLS-1$
private static ProxyInfo cacheProxyInfo = null;
private ProxyInfoManager() {
//hidden
}
public static final ProxyInfo getProxyInfo() throws MalformedURLException,
ProxyConfigException, ProxyUnavailableException {
if (cacheProxyInfo == null) {
cacheProxyInfo = getDynamicProxyInfo(new URL(CHECK_URL));
}
return cacheProxyInfo;
}
private static ProxyInfo getDynamicProxyInfo(URL url) throws ProxyConfigException,
ProxyUnavailableException {
int connection = Config.getIntProperty(Config.PROX_TYPE_KEY);
switch (connection) {
case Config.PROX_TYPE_BROWSER:
logger.info("[SELECT] browser"); //$NON-NLS-1$
cacheProxyInfo = getBrowserProxyInfo(url);
break;
case Config.PROX_TYPE_MANUAL:
logger.info("[SELECT] manual"); //$NON-NLS-1$
String host = Config.getProperty(Config.PROX_HTTP_HOST_KEY);
int port = Integer.parseInt(Config.getProperty(Config.PROX_HTTP_PORT_KEY));
boolean isNotUseLocal = Boolean.parseBoolean(Config.getProperty(Config.PROX_LOCAL_KEY));
cacheProxyInfo = new ProxyInfo(host, port, isNotUseLocal, ProxyInfo.ProxyType.MANUAL);
break;
case Config.PROX_TYPE_AUTO:
logger.info("[SELECT] auto"); //$NON-NLS-1$
cacheProxyInfo = getAutoProxyInfo(url);
break;
case Config.PROX_TYPE_NONE:
logger.info("[SELECT] none"); //$NON-NLS-1$
cacheProxyInfo = new ProxyInfo();
break;
default:
logger.warn("[SELECT] " + connection); //$NON-NLS-1$
cacheProxyInfo = new ProxyInfo();
break;
}
if (logger.isInfoEnabled()) {
logger.info("[HOST] " + cacheProxyInfo.getHost()); //$NON-NLS-1$
logger.info("[PORT] " + cacheProxyInfo.getPort()); //$NON-NLS-1$
if (ProxyInfo.ProxyType.MANUAL.equals(cacheProxyInfo.getProxyType())) {
logger.info("[LOCAL] " + cacheProxyInfo.isNotUseLocal()); //$NON-NLS-1$
}
}
return cacheProxyInfo;
}
private static ProxyInfo getBrowserProxyInfo(URL url) throws ProxyConfigException,
ProxyUnavailableException {
if (System.getProperty("os.name").indexOf("Windows") != -1) { //$NON-NLS-1$ //$NON-NLS-2$
logger.info("[OS] Windows"); //$NON-NLS-1$
com.sun.deploy.services.ServiceManager
.setService(com.sun.deploy.services.PlatformType.STANDALONE_TIGER_WIN32);
} else {
logger.info("[OS] Not Windows"); //$NON-NLS-1$
com.sun.deploy.services.ServiceManager
.setService(com.sun.deploy.services.PlatformType.STANDALONE_TIGER_UNIX);
}
BrowserProxyConfig bpc = ServiceManager.getService().getProxyConfig();
BrowserProxyInfo bpi = bpc.getBrowserProxyInfo();
ProxyHandler handler = ServiceManager.getService().getAutoProxyHandler();
logger.info("[proxy.pac path] " + bpi.getAutoConfigURL()); //$NON-NLS-1$
handler.init(bpi);
logger.info("[check host] " + url.toString()); //$NON-NLS-1$
com.sun.deploy.net.proxy.ProxyInfo[] pi = handler.getProxyInfo(url);
ProxyInfo proxyInfo = null;
if (pi.length > 0) {
com.sun.deploy.net.proxy.ProxyInfo info = pi[0];
proxyInfo = new ProxyInfo(info.getProxy(), info.getPort(), ProxyInfo.ProxyType.BROWSER);
}
return proxyInfo;
}
private static ProxyInfo getAutoProxyInfo(URL url) {
logger.info("[proxy.pac path] " + Config.getProperty(Config.PROX_AUTOCFG_KEY)); //$NON-NLS-1$
DynamicProxyManager.reset();
logger.info("[check host] " + url.toString()); //$NON-NLS-1$
com.sun.deploy.net.proxy.ProxyInfo pi = DynamicProxyManager.getProxyInfo(url);
ProxyInfo proxyInfo = new ProxyInfo(pi.getProxy(), pi.getPort(), ProxyInfo.ProxyType.AUTO);
return proxyInfo;
}
}
ProxyInfo.java
package com.daisukeyamashita.tools.proxyinfo;
public class ProxyInfo {
public enum ProxyType {
BROWSER, MANUAL, AUTO, NONE
}
private final String host;
private final int port;
private final ProxyType type;
private final boolean isNotUseLocal;
ProxyInfo() {
this("", -1, false, ProxyType.NONE); //$NON-NLS-1$
}
ProxyInfo(String host, int port, ProxyType type) {
this(host, port, false, type);
}
ProxyInfo(String host, int port, boolean isNotUseLocal, ProxyType type) {
this.host = host;
this.port = port;
this.isNotUseLocal = isNotUseLocal;
this.type = type;
}
public String getHost() {
return host;
}
public int getPort() {
return port;
}
public ProxyType getProxyType() {
return type;
}
public boolean isNotUseLocal() {
return isNotUseLocal;
}
}


