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.SingleOnSubscribe;
|
||||||
import io.reactivex.android.schedulers.AndroidSchedulers;
|
import io.reactivex.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.schedulers.Schedulers;
|
import io.reactivex.schedulers.Schedulers;
|
||||||
|
import okhttp3.CacheControl;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
import okhttp3.Request;
|
import okhttp3.Request;
|
||||||
import okhttp3.Response;
|
import okhttp3.Response;
|
||||||
@ -21,6 +22,7 @@ import java.io.IOException;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
public class ItunesTopListLoader {
|
public class ItunesTopListLoader {
|
||||||
private static final String TAG = "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";
|
String url = "https://itunes.apple.com/%s/rss/toppodcasts/limit=" + limit + "/explicit=true/json";
|
||||||
Log.d(TAG, "Feed URL " + String.format(url, country));
|
Log.d(TAG, "Feed URL " + String.format(url, country));
|
||||||
Request.Builder httpReq = new Request.Builder()
|
Request.Builder httpReq = new Request.Builder()
|
||||||
|
.cacheControl(new CacheControl.Builder().minFresh(1, TimeUnit.DAYS).build())
|
||||||
.header("User-Agent", ClientConfig.USER_AGENT)
|
.header("User-Agent", ClientConfig.USER_AGENT)
|
||||||
.url(String.format(url, country));
|
.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.PlaybackPreferences;
|
||||||
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
|
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
|
||||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
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.storage.PodDBAdapter;
|
||||||
import de.danoeh.antennapod.core.util.NetworkUtils;
|
import de.danoeh.antennapod.core.util.NetworkUtils;
|
||||||
import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup;
|
import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup;
|
||||||
@ -43,6 +44,7 @@ public class ClientConfig {
|
|||||||
UserPreferences.init(context);
|
UserPreferences.init(context);
|
||||||
PlaybackPreferences.init(context);
|
PlaybackPreferences.init(context);
|
||||||
NetworkUtils.init(context);
|
NetworkUtils.init(context);
|
||||||
|
AntennapodHttpClient.setCacheDirectory(context.getCacheDir());
|
||||||
SleepTimerPreferences.init(context);
|
SleepTimerPreferences.init(context);
|
||||||
RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
|
RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
|
||||||
NotificationUtils.createChannels(context);
|
NotificationUtils.createChannels(context);
|
||||||
|
@ -6,6 +6,8 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.CookieManager;
|
import java.net.CookieManager;
|
||||||
import java.net.CookiePolicy;
|
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.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.core.storage.DBWriter;
|
import de.danoeh.antennapod.core.storage.DBWriter;
|
||||||
|
import okhttp3.Cache;
|
||||||
import okhttp3.CipherSuite;
|
import okhttp3.CipherSuite;
|
||||||
import okhttp3.ConnectionSpec;
|
import okhttp3.ConnectionSpec;
|
||||||
import okhttp3.Credentials;
|
import okhttp3.Credentials;
|
||||||
@ -45,19 +48,18 @@ import okhttp3.internal.http.StatusLine;
|
|||||||
* Provides access to a HttpClient singleton.
|
* Provides access to a HttpClient singleton.
|
||||||
*/
|
*/
|
||||||
public class AntennapodHttpClient {
|
public class AntennapodHttpClient {
|
||||||
|
|
||||||
private AntennapodHttpClient(){}
|
|
||||||
|
|
||||||
private static final String TAG = "AntennapodHttpClient";
|
private static final String TAG = "AntennapodHttpClient";
|
||||||
|
|
||||||
private static final int CONNECTION_TIMEOUT = 10000;
|
private static final int CONNECTION_TIMEOUT = 10000;
|
||||||
private static final int READ_TIMEOUT = 30000;
|
private static final int READ_TIMEOUT = 30000;
|
||||||
|
|
||||||
private static final int MAX_CONNECTIONS = 8;
|
private static final int MAX_CONNECTIONS = 8;
|
||||||
|
private static File cacheDirectory;
|
||||||
|
|
||||||
private static volatile OkHttpClient httpClient = null;
|
private static volatile OkHttpClient httpClient = null;
|
||||||
|
|
||||||
|
private AntennapodHttpClient() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the HttpClient singleton.
|
* Returns the HttpClient singleton.
|
||||||
*/
|
*/
|
||||||
@ -91,14 +93,14 @@ public class AntennapodHttpClient {
|
|||||||
builder.networkInterceptors().add(chain -> {
|
builder.networkInterceptors().add(chain -> {
|
||||||
Request request = chain.request();
|
Request request = chain.request();
|
||||||
Response response = chain.proceed(request);
|
Response response = chain.proceed(request);
|
||||||
if (response.code() == HttpURLConnection.HTTP_MOVED_PERM ||
|
if (response.code() == HttpURLConnection.HTTP_MOVED_PERM
|
||||||
response.code() == StatusLine.HTTP_PERM_REDIRECT) {
|
|| response.code() == StatusLine.HTTP_PERM_REDIRECT) {
|
||||||
String location = response.header("Location");
|
String location = response.header("Location");
|
||||||
if (location.startsWith("/")) { // URL is not absolute, but relative
|
if (location.startsWith("/")) { // URL is not absolute, but relative
|
||||||
HttpUrl url = request.url();
|
HttpUrl url = request.url();
|
||||||
location = url.scheme() + "://" + url.host() + location;
|
location = url.scheme() + "://" + url.host() + location;
|
||||||
} else if (!location.toLowerCase().startsWith("http://") &&
|
} else if (!location.toLowerCase().startsWith("http://")
|
||||||
!location.toLowerCase().startsWith("https://")) {
|
&& !location.toLowerCase().startsWith("https://")) {
|
||||||
// Reference is relative to current path
|
// Reference is relative to current path
|
||||||
HttpUrl url = request.url();
|
HttpUrl url = request.url();
|
||||||
String path = url.encodedPath();
|
String path = url.encodedPath();
|
||||||
@ -124,6 +126,7 @@ public class AntennapodHttpClient {
|
|||||||
builder.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
|
builder.connectTimeout(CONNECTION_TIMEOUT, TimeUnit.MILLISECONDS);
|
||||||
builder.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
|
builder.readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
|
||||||
builder.writeTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
|
builder.writeTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS);
|
||||||
|
builder.cache(new Cache(cacheDirectory, 20L * 1000000)); // 20MB
|
||||||
|
|
||||||
// configure redirects
|
// configure redirects
|
||||||
builder.followRedirects(true);
|
builder.followRedirects(true);
|
||||||
@ -146,9 +149,7 @@ public class AntennapodHttpClient {
|
|||||||
}
|
}
|
||||||
if (Build.VERSION.SDK_INT < 21) {
|
if (Build.VERSION.SDK_INT < 21) {
|
||||||
builder.sslSocketFactory(new CustomSslSocketFactory(), trustManager());
|
builder.sslSocketFactory(new CustomSslSocketFactory(), trustManager());
|
||||||
}
|
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT < 21) {
|
|
||||||
// workaround for Android 4.x for certain web sites.
|
// workaround for Android 4.x for certain web sites.
|
||||||
// see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554
|
// see: https://github.com/square/okhttp/issues/4053#issuecomment-402579554
|
||||||
List<CipherSuite> cipherSuites = new ArrayList<>();
|
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 static class CustomSslSocketFactory extends SSLSocketFactory {
|
||||||
|
|
||||||
private SSLSocketFactory factory;
|
private SSLSocketFactory factory;
|
||||||
|
@ -5,6 +5,7 @@ import android.text.TextUtils;
|
|||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
||||||
|
import okhttp3.CacheControl;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
@ -69,6 +70,7 @@ public class HttpDownloader extends Downloader {
|
|||||||
// set header explicitly so that okhttp doesn't do transparent gzip
|
// set header explicitly so that okhttp doesn't do transparent gzip
|
||||||
Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")");
|
Log.d(TAG, "addHeader(\"Accept-Encoding\", \"identity\")");
|
||||||
httpReq.addHeader("Accept-Encoding", "identity");
|
httpReq.addHeader("Accept-Encoding", "identity");
|
||||||
|
httpReq.cacheControl(new CacheControl.Builder().noStore().build());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(request.getLastModified())) {
|
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.PlaybackPreferences;
|
||||||
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
|
import de.danoeh.antennapod.core.preferences.SleepTimerPreferences;
|
||||||
import de.danoeh.antennapod.core.preferences.UserPreferences;
|
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.storage.PodDBAdapter;
|
||||||
import de.danoeh.antennapod.core.util.NetworkUtils;
|
import de.danoeh.antennapod.core.util.NetworkUtils;
|
||||||
import de.danoeh.antennapod.core.util.exception.RxJavaErrorHandlerSetup;
|
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.");
|
Log.v(TAG, "Cast is disabled. All Cast-related initialization will be skipped.");
|
||||||
}
|
}
|
||||||
installSslProvider(context);
|
installSslProvider(context);
|
||||||
|
AntennapodHttpClient.setCacheDirectory(context.getCacheDir());
|
||||||
SleepTimerPreferences.init(context);
|
SleepTimerPreferences.init(context);
|
||||||
RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
|
RxJavaErrorHandlerSetup.setupRxJavaErrorHandler();
|
||||||
NotificationUtils.createChannels(context);
|
NotificationUtils.createChannels(context);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user