package org.wikipedia.dataclient.okhttp;
import android.support.annotation.NonNull;
import android.support.annotation.VisibleForTesting;
import com.github.kevinsawicki.http.HttpRequest;
import org.wikipedia.WikipediaApp;
import org.wikipedia.dataclient.SharedPreferenceCookieManager;
import org.wikipedia.settings.Prefs;
import org.wikipedia.settings.RbSwitch;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.URL;
import okhttp3.Cache;
import okhttp3.CacheDelegate;
import okhttp3.CookieJar;
import okhttp3.JavaNetCookieJar;
import okhttp3.OkHttpClient;
import okhttp3.OkUrlFactory;
import okhttp3.internal.cache.CacheDelegateInterceptor;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpConnectionFactory implements HttpRequest.ConnectionFactory {
private static final String CACHE_DIR_NAME = "okhttp-cache";
private static final long NET_CACHE_SIZE = 64 * 1024 * 1024;
@VisibleForTesting @NonNull public static final Cache NET_CACHE = new Cache(new File(WikipediaApp.getInstance().getCacheDir(),
CACHE_DIR_NAME), NET_CACHE_SIZE);
private static final long SAVED_PAGE_CACHE_SIZE = NET_CACHE_SIZE * 1024;
@NonNull public static final Cache SAVE_CACHE = new Cache(new File(WikipediaApp.getInstance().getFilesDir(),
CACHE_DIR_NAME), SAVED_PAGE_CACHE_SIZE);
@NonNull private static final OkHttpClient CLIENT = createClient();
@NonNull public static OkHttpClient getClient() {
return CLIENT;
}
@Override
public HttpURLConnection create(URL url) throws IOException {
return new OkUrlFactory(getClient()).open(url); // TODO: update to newer API
}
@Override
public HttpURLConnection create(URL url, Proxy proxy) throws IOException {
throw new UnsupportedOperationException(
"Per-connection proxy is not supported. Use OkHttpClient's setProxy instead.");
}
@NonNull
private static OkHttpClient createClient() {
SharedPreferenceCookieManager cookieManager = WikipediaApp.getInstance().getCookieManager();
// TODO: consider using okhttp3.CookieJar implementation instead of JavaNetCookieJar wrapper
CookieJar cookieJar = new JavaNetCookieJar(cookieManager);
return new OkHttpClient.Builder()
.cookieJar(cookieJar)
.cache(NET_CACHE)
.addInterceptor(new HttpLoggingInterceptor().setLevel(Prefs.getRetrofitLogLevel()))
.addInterceptor(new UnsuccessfulResponseInterceptor())
.addInterceptor(new StatusResponseInterceptor(RbSwitch.INSTANCE))
.addNetworkInterceptor(new StripMustRevalidateResponseInterceptor())
.addInterceptor(new CommonHeaderRequestInterceptor())
.addInterceptor(new DefaultMaxStaleRequestInterceptor())
.addInterceptor(new CacheIfErrorInterceptor())
.addInterceptor(new CacheDelegateInterceptor(CacheDelegate.internalCache(SAVE_CACHE), CacheDelegate.internalCache(NET_CACHE)))
.addInterceptor(new WikipediaZeroResponseInterceptor(WikipediaApp.getInstance().getWikipediaZeroHandler()))
.build();
}
}