diff options
author | ByteHamster <info@bytehamster.com> | 2022-04-01 22:56:21 +0200 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2022-04-01 22:56:28 +0200 |
commit | bd6798d2af5df042e2c17f1d81683bf93faa17df (patch) | |
tree | 6daa562f16efbd2c5f2ea011d3d72ceaf464ab1a /core/src/main | |
parent | 3b47deb7052aee1036416401eada6b680fd8c713 (diff) | |
download | AntennaPod-bd6798d2af5df042e2c17f1d81683bf93faa17df.zip |
Move redirect handling to DownloadService
- Only redirects when feed was parsed successfully (captive portals)
- Decouple http client from database
Diffstat (limited to 'core/src/main')
4 files changed, 26 insertions, 37 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java index b26c57963..b1138eeff 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java @@ -6,20 +6,14 @@ import androidx.annotation.NonNull; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor; import de.danoeh.antennapod.core.service.UserAgentInterceptor; -import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.net.ssl.SslClientSetup; import okhttp3.Cache; import okhttp3.Credentials; -import okhttp3.HttpUrl; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.internal.http.StatusLine; import java.io.File; import java.net.CookieManager; import java.net.CookiePolicy; -import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.SocketAddress; @@ -69,36 +63,6 @@ public class AntennapodHttpClient { System.setProperty("http.maxConnections", String.valueOf(MAX_CONNECTIONS)); OkHttpClient.Builder builder = new OkHttpClient.Builder(); - - // detect 301 Moved permanently and 308 Permanent Redirect - builder.networkInterceptors().add(chain -> { - Request request = chain.request(); - Response response = chain.proceed(request); - if (response.code() == HttpURLConnection.HTTP_MOVED_PERM - || response.code() == StatusLine.HTTP_PERM_REDIRECT) { - String location = response.header("Location"); - if (location == null) { - return response; - } - if (location.startsWith("/")) { // URL is not absolute, but relative - HttpUrl url = request.url(); - location = url.scheme() + "://" + url.host() + location; - } else if (!location.toLowerCase().startsWith("http://") - && !location.toLowerCase().startsWith("https://")) { - // Reference is relative to current path - HttpUrl url = request.url(); - String path = url.encodedPath(); - String newPath = path.substring(0, path.lastIndexOf("/") + 1) + location; - location = url.scheme() + "://" + url.host() + newPath; - } - try { - DBWriter.updateFeedDownloadURL(request.url().toString(), location).get(); - } catch (Exception e) { - Log.e(TAG, Log.getStackTraceString(e)); - } - } - return response; - }); builder.interceptors().add(new BasicAuthorizationInterceptor()); builder.networkInterceptors().add(new UserAgentInterceptor()); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 1522f42e2..218ccba9d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -335,6 +335,9 @@ public class DownloadService extends Service { // Was stored in the database before and not initiated manually newEpisodesNotification.showIfNeeded(DownloadService.this, task.getSavedFeed()); } + if (downloader.permanentRedirectUrl != null) { + DBWriter.updateFeedDownloadURL(request.getSource(), downloader.permanentRedirectUrl); + } } else { DBWriter.setFeedLastUpdateFailed(request.getFeedfileId(), true); saveDownloadStatus(task.getDownloadStatus()); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java index fe44faac9..22c4e9b87 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/Downloader.java @@ -18,8 +18,8 @@ public abstract class Downloader implements Callable<Downloader> { private static final String TAG = "Downloader"; private volatile boolean finished; - public volatile boolean cancelled; + public String permanentRedirectUrl = null; @NonNull final DownloadRequest request; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java index 894428f44..7945239c7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java @@ -7,6 +7,7 @@ import android.util.Log; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.model.download.DownloadStatus; import okhttp3.CacheControl; +import okhttp3.internal.http.StatusLine; import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; @@ -19,6 +20,7 @@ import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.net.URI; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.Collections; import java.util.Date; @@ -173,6 +175,7 @@ public class HttpDownloader extends Downloader { return; } } + checkIfRedirect(response); connection = new BufferedInputStream(responseBody.byteStream()); @@ -279,6 +282,25 @@ public class HttpDownloader extends Downloader { } } + private void checkIfRedirect(Response response) { + // detect 301 Moved permanently and 308 Permanent Redirect + ArrayList<Response> responses = new ArrayList<>(); + while (response != null) { + responses.add(response); + response = response.priorResponse(); + } + if (responses.isEmpty()) { + return; + } + Collections.reverse(responses); + int firstCode = responses.get(0).code(); + if (firstCode == HttpURLConnection.HTTP_MOVED_PERM || firstCode == StatusLine.HTTP_PERM_REDIRECT) { + String secondUrl = responses.get(1).request().url().toString(); + Log.d(TAG, "Detected permanent redirect from " + request.getSource() + " to " + secondUrl); + permanentRedirectUrl = secondUrl; + } + } + private void onSuccess() { Log.d(TAG, "Download was successful"); result.setSuccessful(); |