summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-06-05 11:16:57 +0200
committerSimon Rettberg2015-06-05 11:16:57 +0200
commit9143246a77d8a07398556b34dd812d0dbef0519c (patch)
tree71edb6bf286b06e29f4d0fdd1694edc2f1556a79
parentactually use the backend if it is set :) (diff)
downloadproxy-vole-9143246a77d8a07398556b34dd812d0dbef0519c.tar.gz
proxy-vole-9143246a77d8a07398556b34dd812d0dbef0519c.tar.xz
proxy-vole-9143246a77d8a07398556b34dd812d0dbef0519c.zip
Add HTTP connect timeout
-rw-r--r--src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java138
-rw-r--r--src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java4
2 files changed, 77 insertions, 65 deletions
diff --git a/src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java b/src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java
index cf01fd3..cac3fe0 100644
--- a/src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java
+++ b/src/main/java/com/btr/proxy/search/wpad/WpadProxySearchStrategy.java
@@ -14,7 +14,6 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
-import java.net.UnknownHostException;
import java.util.List;
import java.util.Properties;
@@ -28,7 +27,7 @@ import com.btr.proxy.util.ProxyUtil;
/*****************************************************************************
* Uses automatic proxy script search (WPAD) to find an PAC file automatically.
* <p>
- * Note: at the moment only the DNS name guessing schema is implemented.
+ * Note: at the moment only the DNS name guessing schema is implemented.
* All others are missing.
* </p><p>
* For more information about WPAD:
@@ -41,20 +40,21 @@ import com.btr.proxy.util.ProxyUtil;
****************************************************************************/
public class WpadProxySearchStrategy implements ProxySearchStrategy {
-
+
/*************************************************************************
* Constructor
************************************************************************/
-
+
public WpadProxySearchStrategy() {
super();
}
-
+
/*************************************************************************
- * Loads the proxy settings from a PAC file.
+ * Loads the proxy settings from a PAC file.
* The location of the PAC file is determined automatically.
+ *
* @return a configured ProxySelector, null if none is found.
- * @throws ProxyException on error.
+ * @throws ProxyException on error.
************************************************************************/
public ProxySelector getProxySelector() throws ProxyException {
@@ -75,12 +75,13 @@ public class WpadProxySearchStrategy implements ProxySearchStrategy {
throw new ProxyException(e);
}
}
-
+
/*************************************************************************
* Loads the settings and stores them in a properties map.
+ *
* @return the settings.
************************************************************************/
-
+
public Properties readSettings() {
try {
String pacScriptUrl = detectScriptUrlPerDHCP();
@@ -101,61 +102,60 @@ public class WpadProxySearchStrategy implements ProxySearchStrategy {
/*************************************************************************
* Uses DNS to find the script URL.
- * Attention: this detection method is known to have some severe security issues.
+ * Attention: this detection method is known to have some severe security
+ * issues.
+ *
* @return the URL, null if not found.
************************************************************************/
-
+
private String detectScriptUrlPerDNS() throws IOException {
String result = null;
// String fqdn = InetAddress.getLocalHost().getCanonicalHostName();
-
+ // TODO: Java way of finding all search domains? Seems not trivial
+ // Windows workaround could be running ipconfig /all and parsing...
Logger.log(getClass(), LogLevel.TRACE, "Searching per DNS guessing.");
// Logger.log(getClass(), LogLevel.INFO, "fqdn: ", fqdn);
- /** Reading address from "/etc/resolv.conf"; file looks like:
- *
- # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
- # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
- nameserver 127.0.1.1
- search ruf.uni-freiburg.de lp.ruf.uni-freiburg.de
- */
-
FileReader fr = new FileReader("/etc/resolv.conf");
BufferedReader br = new BufferedReader(fr);
-
- String input;
+ ;
String[] addresses = null;
- // using the 4th line of the file.
- while ((input = br.readLine()) != null) {
- if (input.startsWith("search")) {
- // the first one is "search" and afterwards addresses are following.
- addresses = input.substring(6).split(" ");
- break;
+ try {
+ String input;
+ while ((input = br.readLine()) != null) {
+ if (input.startsWith("search")) {
+ // the first one is "search" and afterwards addresses are following.
+ addresses = input.substring(6).split(" ");
+ break;
+ }
}
+ } finally {
+ br.close();
}
-
+
if (addresses == null) {
addresses = new String[]{""};
}
-
-
+
+ String addr;
for (int i = 0; i < addresses.length; ++i) {
- String address = addresses[i];
- int index = -1;
+ String address = addresses[i].trim();
+ if (address.length() < 1)
+ continue;
do {
- if (index != -1) {
- address = address.substring(index);
- } else {
- address = "";
- }
-
// Try to connect to URL
try {
- address = ".uni-freiburg.de";
- URL lookupURL = new URL("http://wpad"+ address +"/wpad.dat");
- Logger.log(getClass(), LogLevel.TRACE, "Trying url: {0}", lookupURL);
-
+ if (address.length() != 0)
+ addr = "." + address;
+ else
+ addr = address;
+ URL lookupURL = new URL("http://wpad" + addr + "/wpad.dat");
+ Logger.log(getClass(), LogLevel.DEBUG, "Trying url: {0}", lookupURL);
+
HttpURLConnection con = (HttpURLConnection) lookupURL.openConnection(Proxy.NO_PROXY);
+ con.setConnectTimeout(1000);
+ con.setReadTimeout(2000);
+ con.setRequestMethod("HEAD");
con.setInstanceFollowRedirects(true);
con.setRequestProperty("accept", "application/x-ns-proxy-autoconfig");
if (con.getResponseCode() == 200) {
@@ -163,44 +163,52 @@ public class WpadProxySearchStrategy implements ProxySearchStrategy {
return result;
}
con.disconnect();
- } catch (UnknownHostException e) {
+ } catch (Exception e) {
Logger.log(getClass(), LogLevel.DEBUG, "Not available!");
// Not a real error, try next address
}
if (address.length() == 0) {
break;
}
- index = address.indexOf('.', 1);
+ int index = address.indexOf('.');
+ if (index != -1 && index < address.length())
+ address = address.substring(index + 1);
+ else
+ address = "";
+ if (address.indexOf('.') == -1 || address.length() < 7) // don't construct something like wpad.de....
+ address = "";
} while (true);
}
-
+
return null;
}
/*************************************************************************
* Uses DHCP to find the script URL.
+ *
* @return the URL, null if not found.
************************************************************************/
-
+
private String detectScriptUrlPerDHCP() {
Logger.log(getClass(), LogLevel.DEBUG, "Searching per DHCP not supported yet.");
// TODO Rossi 28.04.2009 Not implemented yet.
return null;
}
-
+
// Main method for testing.
- public static void main( String[] args ) throws IOException {
+ public static void main(String[] args) throws IOException {
WpadProxySearchStrategy wPSS = new WpadProxySearchStrategy();
-// System.setProperty("com.btr.proxy.pac.overrideLocalIP", "10.0.0.1");
+ // System.setProperty("com.btr.proxy.pac.overrideLocalIP", "10.0.0.1");
try {
ProxySelector pS = wPSS.getProxySelector();
ProxySelector.setDefault(pS);
List<Proxy> proxyList = pS.select(new URI("http://www.google.de"));
-
+
if (proxyList.isEmpty()) {
Logger.log(WpadProxySearchStrategy.class, LogLevel.INFO, "ProxyList is empty!");
} else {
- Logger.log(WpadProxySearchStrategy.class, LogLevel.INFO, "proxyList contains: {0}", proxyList.toString());
+ Logger.log(WpadProxySearchStrategy.class, LogLevel.INFO, "proxyList contains: {0}",
+ proxyList.toString());
}
} catch (ProxyException e) {
// TODO bjoern 28.10.2014 Auto-generated catch block
@@ -209,26 +217,30 @@ public class WpadProxySearchStrategy implements ProxySearchStrategy {
// TODO bjoern 28.10.2014 Auto-generated catch block
e.printStackTrace();
}
-
+
URL test = new URL("http://www.google.de");
URLConnection uc = test.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream()));
-
+
String inputLine;
while ((inputLine = br.readLine()) != null) {
System.out.println(inputLine);
}
-
+
Socket socket = new Socket("www.google.de", 80);
- BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
- bw.write("GET / HTTP/1.1\r\nHost: www.google.de\r\nConnection: close\r\nAccept-Encoding: *\r\n\r\n");
- bw.flush();
-
- br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
- while ((inputLine = br.readLine()) != null) {
- System.out.println(inputLine);
+ try {
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
+ bw.write("GET / HTTP/1.1\r\nHost: www.google.de\r\nConnection: close\r\nAccept-Encoding: *\r\n\r\n");
+ bw.flush();
+
+ br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
+ while ((inputLine = br.readLine()) != null) {
+ System.out.println(inputLine);
+ }
+ } finally {
+ socket.close();
}
-
+
}
}
diff --git a/src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java b/src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java
index 6ac8faa..c31b2d0 100644
--- a/src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java
+++ b/src/main/java/com/btr/proxy/selector/pac/UrlPacScriptSource.java
@@ -24,8 +24,8 @@ import com.btr.proxy.util.Logger.LogLevel;
public class UrlPacScriptSource implements PacScriptSource {
- private static final int DEFAULT_CONNECT_TIMEOUT = 15 * 1000; // seconds
- private static final int DEFAULT_READ_TIMEOUT = 20 * 1000; // seconds
+ private static final int DEFAULT_CONNECT_TIMEOUT = 1 * 1000; // seconds
+ private static final int DEFAULT_READ_TIMEOUT = 2 * 1000; // seconds
public static final String OVERRIDE_CONNECT_TIMEOUT = "com.btr.proxy.url.connectTimeout";
public static final String OVERRIDE_READ_TIMEOUT = "com.btr.proxy.url.readTimeout";