From d531e03f334c85a52233217f4ac5d3269b9db3a5 Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Sun, 16 Dec 2012 17:13:17 +0100 Subject: Follow 307 redirects --- .../service/download/HttpDownloader.java | 72 +++++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) (limited to 'src/de/danoeh/antennapod') diff --git a/src/de/danoeh/antennapod/service/download/HttpDownloader.java b/src/de/danoeh/antennapod/service/download/HttpDownloader.java index a4fdefbe3..7e419ae3c 100644 --- a/src/de/danoeh/antennapod/service/download/HttpDownloader.java +++ b/src/de/danoeh/antennapod/service/download/HttpDownloader.java @@ -14,6 +14,8 @@ import java.net.URL; import java.net.UnknownHostException; import org.apache.commons.io.IOUtils; +import org.apache.http.HttpConnection; +import org.apache.http.HttpStatus; import android.util.Log; import de.danoeh.antennapod.AppConfig; @@ -25,6 +27,8 @@ import de.danoeh.antennapod.util.StorageUtils; public class HttpDownloader extends Downloader { private static final String TAG = "HttpDownloader"; + private static final int MAX_REDIRECTS = 5; + private static final int BUFFER_SIZE = 8 * 1024; private static final int CONNECTION_TIMEOUT = 5000; @@ -32,17 +36,70 @@ public class HttpDownloader extends Downloader { super(downloadService, status); } + /** + * This method is called by establishConnection(String). Don't call it + * directly. + * */ + private HttpURLConnection establishConnection(String location, + int redirectCount) throws MalformedURLException, IOException { + URL url = new URL(location); + HttpURLConnection connection = null; + int responseCode = -1; + connection = (HttpURLConnection) url.openConnection(); + connection.setConnectTimeout(CONNECTION_TIMEOUT); + // try with 'follow redirect' + connection.setInstanceFollowRedirects(true); + try { + responseCode = connection.getResponseCode(); + } catch (IOException e) { + if (AppConfig.DEBUG) + Log.d(TAG, + "Failed to establish connection with 'follow redirects. Disabling 'follow redirects'"); + connection.disconnect(); + connection.setInstanceFollowRedirects(false); + responseCode = connection.getResponseCode(); + } + if (AppConfig.DEBUG) + Log.d(TAG, "Response Code: " + responseCode); + switch (responseCode) { + case HttpStatus.SC_TEMPORARY_REDIRECT: + if (redirectCount < MAX_REDIRECTS) { + final String redirect = connection.getHeaderField("Location"); + if (redirect != null) { + return establishConnection(redirect, redirectCount + 1); + } + } + case HttpStatus.SC_OK: + return connection; + default: + onFail(DownloadError.ERROR_HTTP_DATA_ERROR, + String.valueOf(responseCode)); + return null; + } + } + + /** + * Establish connection to resource. This method will also try to handle + * different response codes / redirect issues. + * + * @return the HttpURLConnection object if the connection could be opened, + * null otherwise. + * @throws MalformedURLException + * , IOException + * */ + private HttpURLConnection establishConnection(String location) + throws MalformedURLException, IOException { + return establishConnection(location, 0); + } + @Override protected void download() { HttpURLConnection connection = null; OutputStream out = null; try { - URL url = new URL(status.getFeedFile().getDownload_url()); - connection = (HttpURLConnection) url.openConnection(); - connection.setConnectTimeout(CONNECTION_TIMEOUT); - connection.setInstanceFollowRedirects(true); - int responseCode = connection.getResponseCode(); - if (responseCode == HttpURLConnection.HTTP_OK) { + connection = establishConnection(status.getFeedFile() + .getDownload_url()); + if (connection != null) { if (AppConfig.DEBUG) { Log.d(TAG, "Connected to resource"); } @@ -94,9 +151,6 @@ public class HttpDownloader extends Downloader { } else { onFail(DownloadError.ERROR_DEVICE_NOT_FOUND, null); } - } else { - onFail(DownloadError.ERROR_HTTP_DATA_ERROR, - String.valueOf(responseCode)); } } catch (MalformedURLException e) { e.printStackTrace(); -- cgit v1.2.3