Allow HTTP <--> HTTPS redirects (max 3) in Download class.
Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
b98c646106
commit
b9adf59d53
|
@ -46,6 +46,9 @@ public class Download {
|
||||||
/** Read timeout, in ms. */
|
/** Read timeout, in ms. */
|
||||||
public static final int READ_TIMEOUT = 10000;
|
public static final int READ_TIMEOUT = 10000;
|
||||||
|
|
||||||
|
/** Maximum number of HTTP/HTTPS redirects to follow. */
|
||||||
|
public static final int MAX_REDIRECTS = 3;
|
||||||
|
|
||||||
/** Time between download speed and ETA updates, in ms. */
|
/** Time between download speed and ETA updates, in ms. */
|
||||||
private static final int UPDATE_INTERVAL = 1000;
|
private static final int UPDATE_INTERVAL = 1000;
|
||||||
|
|
||||||
|
@ -172,13 +175,57 @@ public class Download {
|
||||||
new Thread() {
|
new Thread() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
// open connection, get content length
|
// open connection
|
||||||
HttpURLConnection conn = null;
|
HttpURLConnection conn = null;
|
||||||
try {
|
try {
|
||||||
conn = (HttpURLConnection) url.openConnection();
|
URL downloadURL = url;
|
||||||
|
int redirectCount = 0;
|
||||||
|
boolean isRedirect = false;
|
||||||
|
do {
|
||||||
|
isRedirect = false;
|
||||||
|
|
||||||
|
conn = (HttpURLConnection) downloadURL.openConnection();
|
||||||
conn.setConnectTimeout(CONNECTION_TIMEOUT);
|
conn.setConnectTimeout(CONNECTION_TIMEOUT);
|
||||||
conn.setReadTimeout(READ_TIMEOUT);
|
conn.setReadTimeout(READ_TIMEOUT);
|
||||||
conn.setUseCaches(false);
|
conn.setUseCaches(false);
|
||||||
|
|
||||||
|
// allow HTTP <--> HTTPS redirects
|
||||||
|
// http://download.java.net/jdk7u2/docs/technotes/guides/deployment/deployment-guide/upgrade-guide/article-17.html
|
||||||
|
conn.setInstanceFollowRedirects(false);
|
||||||
|
conn.setRequestProperty("User-Agent", "Mozilla/5.0...");
|
||||||
|
|
||||||
|
// check for redirect
|
||||||
|
int status = conn.getResponseCode();
|
||||||
|
if (status == HttpURLConnection.HTTP_MOVED_TEMP || status == HttpURLConnection.HTTP_MOVED_PERM ||
|
||||||
|
status == HttpURLConnection.HTTP_SEE_OTHER || status == HttpURLConnection.HTTP_USE_PROXY) {
|
||||||
|
URL base = conn.getURL();
|
||||||
|
String location = conn.getHeaderField("Location");
|
||||||
|
URL target = null;
|
||||||
|
if (location != null)
|
||||||
|
target = new URL(base, location);
|
||||||
|
conn.disconnect();
|
||||||
|
|
||||||
|
// check for problems
|
||||||
|
String error = null;
|
||||||
|
if (location == null)
|
||||||
|
error = String.format("Download for URL '%s' is attempting to redirect without a 'location' header.", base.toString());
|
||||||
|
else if (!target.getProtocol().equals("http") && !target.getProtocol().equals("https"))
|
||||||
|
error = String.format("Download for URL '%s' is attempting to redirect to a non-HTTP/HTTPS protocol '%s'.", base.toString(), target.getProtocol());
|
||||||
|
else if (redirectCount > MAX_REDIRECTS)
|
||||||
|
error = String.format("Download for URL '%s' is attempting too many redirects (over %d).", base.toString(), MAX_REDIRECTS);
|
||||||
|
if (error != null) {
|
||||||
|
ErrorHandler.error(error, null, false);
|
||||||
|
throw new IOException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// follow redirect
|
||||||
|
downloadURL = target;
|
||||||
|
redirectCount++;
|
||||||
|
isRedirect = true;
|
||||||
|
}
|
||||||
|
} while (isRedirect);
|
||||||
|
|
||||||
|
// store content length
|
||||||
contentLength = conn.getContentLength();
|
contentLength = conn.getContentLength();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
status = Status.ERROR;
|
status = Status.ERROR;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user