Проблема с настройками прокси при получении SocketException - PullRequest
0 голосов
/ 29 января 2020

Здравствуйте! У меня проблемы с настройками прокси в веб-приложении. Я обычно работал, делая что-то вроде этого:

String proxyAddress = "myproxy.internal.customer.com";
String proxyPort= "80";

System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", proxyAddress);
System.setProperty("http.proxyPort", proxyPort);

К сожалению, эти настройки "classi c" не могут быть использованы в моем приложении, потому что создают конфликты с другим приложением. Поэтому я выбрал решение, расширяющее класс ProxySelector с помощью пользовательского класса, например:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.SocketAddress;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;

import eu.mycustomer.PropertiesLoader;

public class CustomProxySelector extends ProxySelector {

    private final ProxySelector def;

    private List<Proxy> proxyList = new ArrayList<>();

    public CustomProxySelector(String proxyHost, String proxyPort) {
        this.def = ProxySelector.getDefault();
        proxyList.add(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, (null == proxyPort) ? 80 : Integer.valueOf(proxyPort))));
        ProxySelector.setDefault(this);
    }

    @Override
    public List<Proxy> select(URI uri) {
        if (uri == null) {
            throw new IllegalArgumentException("URI can't be null.");
        }
        String[] proxyHttpsForExternal = PropertiesLoader.getInstance().getProperty("proxy.https.for.external").split(";");
        for(String s : proxyHttpsForExternal) {
            if (uri.getHost().contains(s)) {
                return proxyList;
            }
        }
        return def.select(uri);
    }

    @Override
    public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
        if (uri == null || sa == null || ioe == null) {
            throw new IllegalArgumentException("Arguments can't be null.");
        }
        def.connectFailed(uri, sa, ioe);
    }
} 

, и затем настройку перед вызовом веб-службы с помощью:

ProxySelector.setDefault(new CustomProxySelector(proxyAddress, proxyPort));

Но я получил следующее исключение в классе IBM SocksSocketImpl :

java.net.SocketException: Unknown proxy type : HTTP

Декомпилируя класс, я увидел это:

.....
.....
        Proxy p = null;
        IOException savedExc = null;
        java.util.Iterator<Proxy> iProxy = null;
        iProxy = sel.select(uri).iterator();
        if (iProxy == null || !(iProxy.hasNext())) {
        super.connect(epoint, timeout);
        return;
        }
        while (iProxy.hasNext()) {
        p = iProxy.next();
        if (p == null || p == Proxy.NO_PROXY) {
            super.connect(epoint, timeout);
            return;
        }
        if (p.type() != Proxy.Type.SOCKS)
            throw new SocketException("Unknown proxy type : " + p.type());

.....
.....

Я использую Java 1.5, Axis 1.3 и приложение работает под websphere 6.1 (да, я знаю, что оно старое :)). Любая подсказка / предложение будет очень признателен. Альтернативные решения приветствуются, но они должны исключать подход System.setProperty. Спасибо!

...