diff options
Diffstat (limited to 'src/main/java/com/btr/proxy/selector')
3 files changed, 73 insertions, 24 deletions
diff --git a/src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java b/src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java index 2de95b5..79e0866 100644 --- a/src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java +++ b/src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java @@ -3,10 +3,12 @@ package com.btr.proxy.selector.fixed; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Proxy; +import java.net.Proxy.Type; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -19,7 +21,7 @@ import java.util.List; public class FixedProxySelector extends ProxySelector { - private final List<Proxy> proxyList; + private List<Proxy> proxyList; /************************************************************************* @@ -27,12 +29,13 @@ public class FixedProxySelector extends ProxySelector { * @param proxy the proxy to use. ************************************************************************/ - public FixedProxySelector(Proxy proxy) { + public FixedProxySelector(Proxy... proxy) { super(); - - List<Proxy> list = new ArrayList<Proxy>(1); - list.add(proxy); - this.proxyList = Collections.unmodifiableList(list); + if (proxy.length == 0) + throw new IllegalArgumentException("Empty list was passed"); + this.proxyList = Collections.unmodifiableList(Arrays.asList(proxy)); + if (this.proxyList.contains(null)) + throw new NullPointerException("List conains NULL proxy"); } /************************************************************************* @@ -53,7 +56,24 @@ public class FixedProxySelector extends ProxySelector { @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { - // Not used + final List<Proxy> list = this.proxyList; + if (list.size() < 2) + return; + if (!list.get(0).address().equals(sa)) + return; // We only care if the failing one is the first one in list + List<Proxy> newList = new ArrayList<>(list.size()); + Proxy broken = null; + for (Proxy p : list) { + if (p.address().equals(sa)) { + broken = p; + } else { + newList.add(p); + } + } + if (broken != null) { + newList.add(broken); + } + this.proxyList = Collections.unmodifiableList(newList); } /************************************************************************* @@ -66,4 +86,8 @@ public class FixedProxySelector extends ProxySelector { return this.proxyList; } + public Type getType() { + return this.proxyList.get(0).type(); + } + } diff --git a/src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java b/src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java index 02ecc44..bb57452 100644 --- a/src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java +++ b/src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java @@ -10,6 +10,9 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.btr.proxy.selector.direct.NoProxySelector; +import com.btr.proxy.selector.fixed.FixedProxySelector; +import com.btr.proxy.util.Logger; +import com.btr.proxy.util.Logger.LogLevel; /***************************************************************************** * This is a facade for a list of ProxySelecor objects. You can register @@ -46,6 +49,9 @@ public class ProtocolDispatchSelector extends ProxySelector { if (selector == null) { throw new NullPointerException("Selector must not be null."); } + if (protocol.toLowerCase().startsWith("socks")) { + protocol = "socket"; + } this.selectors.put(protocol, selector); } @@ -82,6 +88,17 @@ public class ProtocolDispatchSelector extends ProxySelector { this.fallbackSelector = selector; } + private ProxySelector selectorForUri(URI uri) { + if (uri == null || uri.getScheme() == null) + return this.fallbackSelector; + String protocol = uri.getScheme(); + ProxySelector selector = this.selectors.get(protocol); + if (selector == null) { + selector = this.fallbackSelector; + } + return selector; + } + /************************************************************************* * connectFailed * @see java.net.ProxySelector#connectFailed(java.net.URI, java.net.SocketAddress, java.io.IOException) @@ -89,11 +106,7 @@ public class ProtocolDispatchSelector extends ProxySelector { @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { - ProxySelector selector = this.fallbackSelector; - String protocol = uri.getScheme(); - if (protocol != null && this.selectors.get(protocol) != null) { - selector = this.selectors.get(protocol); - } + ProxySelector selector = selectorForUri(uri); selector.connectFailed(uri, sa, ioe); } @@ -104,19 +117,25 @@ public class ProtocolDispatchSelector extends ProxySelector { @Override public List<Proxy> select(URI uri) { - ProxySelector selector = null; - String protocol = uri.getScheme(); - if (protocol != null && this.selectors.get(protocol) != null) { - selector = this.selectors.get(protocol); - } - if (selector == null && this.selectors.get("socks") != null) { - // Socks should always work - selector = this.selectors.get("socks"); - } - if (selector == null) { - selector = this.fallbackSelector; + ProxySelector selector = selectorForUri(uri); + List<Proxy> ret = selector.select(uri); + Logger.log(getClass(), LogLevel.TRACE, "Selector {0} for {1} -> {2}", selector.getClass(), uri, ret); + return ret; + } + + public void setFallbackSocksSelector(FixedProxySelector... pslist) { + if (!(this.fallbackSelector instanceof NoProxySelector)) + return; + for (FixedProxySelector ps : pslist) { + if (ps != null && ps.getType() == Proxy.Type.SOCKS) { + this.fallbackSelector = ps; + return; + } } - return selector.select(uri); + } + + public boolean isEmpty() { + return this.selectors.isEmpty() && this.fallbackSelector instanceof NoProxySelector; } } diff --git a/src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java b/src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java index 41859ec..e501952 100644 --- a/src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java +++ b/src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; +import com.btr.proxy.util.ProxyUtil; + /***************************************************************************** * Implements a fallback selector to warp it around an existing ProxySelector. * This will remove proxies from a list of proxies and implement an automatic @@ -58,6 +60,7 @@ public class ProxyListFallbackSelector extends ProxySelector { @Override public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { this.failedDelayCache.put(sa, System.currentTimeMillis()); + this.delegate.connectFailed(uri, sa, ioe); } /************************************************************************* @@ -70,6 +73,9 @@ public class ProxyListFallbackSelector extends ProxySelector { cleanupCache(); List<Proxy> proxyList = this.delegate.select(uri); List<Proxy> result = filterUnresponsiveProxiesFromList(proxyList); + if (result.isEmpty()) { + return ProxyUtil.noProxyList(); + } return result; } |