JAL-3130 adapted getdown src. attempt 2. first attempt failed due to cp'ed .git files
[jalview.git] / getdown / src / getdown / core / src / main / java / com / threerings / getdown / util / ConnectionUtil.java
diff --git a/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/ConnectionUtil.java b/getdown/src/getdown/core/src/main/java/com/threerings/getdown/util/ConnectionUtil.java
new file mode 100644 (file)
index 0000000..21b0569
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// Getdown - application installer, patcher and launcher
+// Copyright (C) 2004-2018 Getdown authors
+// https://github.com/threerings/getdown/blob/master/LICENSE
+
+package com.threerings.getdown.util;
+
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.Proxy;
+import java.net.URL;
+import java.net.URLConnection;
+import java.net.URLDecoder;
+
+import com.threerings.getdown.data.SysProps;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+public class ConnectionUtil
+{
+    /**
+     * Opens a connection to a URL, setting the authentication header if user info is present.
+     * @param proxy the proxy via which to perform HTTP connections.
+     * @param url the URL to which to open a connection.
+     * @param connectTimeout if {@code > 0} then a timeout, in seconds, to use when opening the
+     * connection. If {@code 0} is supplied, the connection timeout specified via system properties
+     * will be used instead.
+     * @param readTimeout if {@code > 0} then a timeout, in seconds, to use while reading data from
+     * the connection. If {@code 0} is supplied, the read timeout specified via system properties
+     * will be used instead.
+     */
+    public static URLConnection open (Proxy proxy, URL url, int connectTimeout, int readTimeout)
+        throws IOException
+    {
+        URLConnection conn = url.openConnection(proxy);
+
+        // configure a connect timeout, if requested
+        int ctimeout = connectTimeout > 0 ? connectTimeout : SysProps.connectTimeout();
+        if (ctimeout > 0) {
+            conn.setConnectTimeout(ctimeout * 1000);
+        }
+
+        // configure a read timeout, if requested
+        int rtimeout = readTimeout > 0 ? readTimeout : SysProps.readTimeout();
+        if (rtimeout > 0) {
+            conn.setReadTimeout(rtimeout * 1000);
+        }
+
+        // If URL has a username:password@ before hostname, use HTTP basic auth
+        String userInfo = url.getUserInfo();
+        if (userInfo != null) {
+            // Remove any percent-encoding in the username/password
+            userInfo = URLDecoder.decode(userInfo, "UTF-8");
+            // Now base64 encode the auth info and make it a single line
+            String encoded = Base64.encodeToString(userInfo.getBytes(UTF_8), Base64.DEFAULT).
+                replaceAll("\\n","").replaceAll("\\r", "");
+            conn.setRequestProperty("Authorization", "Basic " + encoded);
+        }
+
+        return conn;
+    }
+
+    /**
+     * Opens a connection to a http or https URL, setting the authentication header if user info is
+     * present. Throws a class cast exception if the connection returned is not the right type. See
+     * {@link #open} for parameter documentation.
+     */
+    public static HttpURLConnection openHttp (
+        Proxy proxy, URL url, int connectTimeout, int readTimeout) throws IOException
+    {
+        return (HttpURLConnection)open(proxy, url, connectTimeout, readTimeout);
+    }
+}