From 7bfee9ba0f69610364f41493bb1301d1b4a40a12 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Mon, 16 Mar 2020 00:55:05 +0100 Subject: Enable caching for web responses --- .../antennapod/discovery/ItunesTopListLoader.java | 3 +++ .../de/danoeh/antennapod/core/ClientConfig.java | 2 ++ .../service/download/AntennapodHttpClient.java | 29 +++++++++++++--------- .../core/service/download/HttpDownloader.java | 2 ++ .../de/danoeh/antennapod/core/ClientConfig.java | 2 ++ 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java index ee318c706..bb0e165b7 100644 --- a/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java +++ b/app/src/main/java/de/danoeh/antennapod/discovery/ItunesTopListLoader.java @@ -10,6 +10,7 @@ import io.reactivex.Single; import io.reactivex.SingleOnSubscribe; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; +import okhttp3.CacheControl; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -21,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.concurrent.TimeUnit; public class ItunesTopListLoader { private static final String TAG = "ITunesTopListLoader"; @@ -81,6 +83,7 @@ public class ItunesTopListLoader { String url = "https://itunes.apple.com/%s/rss/toppodcasts/limit=" + limit + "/explicit=true/json"; Log.d(TAG, "Feed URL " + String.format(url, country)); Request.Builder httpReq = new Request.Builder() + .cacheControl(new CacheControl.Builder().minFresh(1, TimeUnit.DAYS).build()) .header("User-Agent", ClientConfig.USER_AGENT) .url(String.format(url, country)); diff --git a/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java index 54cd84b43..cd075c1cf 100644 --- a/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/free/java/de/danoeh/antennapod/core/ClientConfig.java @@ -5,6 +5,7 @@ import android.content.Context; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup; @@ -43,6 +44,7 @@ public class ClientConfig { UserPreferences.init(context); PlaybackPreferences.init(context); NetworkUtils.init(context); + AntennapodHttpClient.setCacheDirectory(context.getCacheDir()); SleepTimerPreferences.init(context); RxJavaErrorHandlerSetup.setupRxJavaErrorHandler(); NotificationUtils.createChannels(context); 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 8f368c76e..ee0f8bd95 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,6 +6,8 @@ import android.text.TextUtils; import android.util.Log; import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor; + +import java.io.File; import java.io.IOException; import java.net.CookieManager; import java.net.CookiePolicy; @@ -31,6 +33,7 @@ import javax.net.ssl.X509TrustManager; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.storage.DBWriter; +import okhttp3.Cache; import okhttp3.CipherSuite; import okhttp3.ConnectionSpec; import okhttp3.Credentials; @@ -45,19 +48,18 @@ import okhttp3.internal.http.StatusLine; * Provides access to a HttpClient singleton. */ public class AntennapodHttpClient { - - private AntennapodHttpClient(){} - private static final String TAG = "AntennapodHttpClient"; - private static final int CONNECTION_TIMEOUT = 10000; private static final int READ_TIMEOUT = 30000; - private static final int MAX_CONNECTIONS = 8; - + private static File cacheDirectory; private static volatile OkHttpClient httpClient = null; + private AntennapodHttpClient() { + + } + /** * Returns the HttpClient singleton. */ @@ -91,14 +93,14 @@ public class AntennapodHttpClient { 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) { + if (response.code() == HttpURLConnection.HTTP_MOVED_PERM + || response.code() == StatusLine.HTTP_PERM_REDIRECT) { String location = response.header("Location"); 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://")) { + } else if (!location.toLowerCase().startsWith("http://") + && !location.toLowerCase().startsWith("https://")) { // Reference is relative to current path HttpUrl url = request.url(); String path = url.encodedPath(); @@ -124,6 +126,7 @@ public class AntennapodHttpClient { builder.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS); builder.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS); builder.writeTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS); + builder.cache(new Cache(cacheDirectory, 20L * 1000000)); // 20MB // configure redirects builder.followRedirects(true); @@ -146,9 +149,7 @@ public class AntennapodHttpClient { } if (Build.VERSION.SDK_INT < 21) { builder.sslSocketFactory(new CustomSslSocketFactory(), trustManager()); - } - if (Build.VERSION.SDK_INT < 21) { // workaround for Android 4.x for certain web sites. // see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554 List cipherSuites = new ArrayList<>(); @@ -192,6 +193,10 @@ public class AntennapodHttpClient { } } + public static void setCacheDirectory(File cacheDirectory) { + AntennapodHttpClient.cacheDirectory = cacheDirectory; + } + private static class CustomSslSocketFactory extends SSLSocketFactory { private SSLSocketFactory factory; 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 551a20bf2..46b8568c5 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 @@ -5,6 +5,7 @@ import android.text.TextUtils; import android.util.Log; import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor; +import okhttp3.CacheControl; import org.apache.commons.io.IOUtils; import java.io.BufferedInputStream; @@ -69,6 +70,7 @@ public class HttpDownloader extends Downloader { // set header explicitly so that okhttp doesn't do transparent gzip Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")"); httpReq.addHeader("Accept-Encoding", "identity"); + httpReq.cacheControl(new CacheControl.Builder().noStore().build()); } if (!TextUtils.isEmpty(request.getLastModified())) { diff --git a/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java index c92ce3e74..afed2aaae 100644 --- a/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/play/java/de/danoeh/antennapod/core/ClientConfig.java @@ -11,6 +11,7 @@ import de.danoeh.antennapod.core.cast.CastManager; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.preferences.UserPreferences; +import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; import de.danoeh.antennapod.core.storage.PodDBAdapter; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup; @@ -62,6 +63,7 @@ public class ClientConfig { Log.v(TAG, "Cast is disabled. All Cast-related initialization will be skipped."); } installSslProvider(context); + AntennapodHttpClient.setCacheDirectory(context.getCacheDir()); SleepTimerPreferences.init(context); RxJavaErrorHandlerSetup.setupRxJavaErrorHandler(); NotificationUtils.createChannels(context); -- cgit v1.2.3