summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/btr/proxy/selector
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/btr/proxy/selector')
-rw-r--r--src/main/java/com/btr/proxy/selector/fixed/FixedProxySelector.java38
-rw-r--r--src/main/java/com/btr/proxy/selector/misc/ProtocolDispatchSelector.java53
-rw-r--r--src/main/java/com/btr/proxy/selector/misc/ProxyListFallbackSelector.java6
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;
}