Javaでproxy.pacを処理させる簡単な方法 その2 at ミネルヴァの梟は黄昏とともに飛び始める

ミネルヴァの梟は黄昏とともに飛び始める

Follow me on Twitter: http://www.twitter.com/dddaisuke

Javaでproxy.pacを処理させる簡単な方法 その2

without comments

 その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;
    }
}

Written by daisuke

5月 28th, 2008 at 8:46 pm

Posted in Java

Leave a Reply