Enable caching for web responses
This commit is contained in:
parent
03d1f41e9b
commit
7bfee9ba0f
@ -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));
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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())) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user