Enable caching for web responses

This commit is contained in:
ByteHamster 2020-03-16 00:55:05 +01:00
parent 03d1f41e9b
commit 7bfee9ba0f
5 changed files with 26 additions and 12 deletions

View File

@ -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));

View File

@ -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);

View File

@ -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<CipherSuite> 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;

View File

@ -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())) {

View File

@ -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);