Merge pull request #3716 from ByteHamster/only-one-httpclient
Do not create new httpclient for each download
This commit is contained in:
commit
9b50cbbe0e
|
@ -11,6 +11,7 @@ import com.bumptech.glide.load.model.GlideUrl;
|
||||||
import com.bumptech.glide.load.model.ModelLoader;
|
import com.bumptech.glide.load.model.ModelLoader;
|
||||||
import com.bumptech.glide.load.model.ModelLoaderFactory;
|
import com.bumptech.glide.load.model.ModelLoaderFactory;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
|
@ -49,7 +50,6 @@ class ApOkHttpUrlLoader implements ModelLoader<String, InputStream> {
|
||||||
if (internalClient == null) {
|
if (internalClient == null) {
|
||||||
OkHttpClient.Builder builder = AntennapodHttpClient.newBuilder();
|
OkHttpClient.Builder builder = AntennapodHttpClient.newBuilder();
|
||||||
builder.interceptors().add(new NetworkAllowanceInterceptor());
|
builder.interceptors().add(new NetworkAllowanceInterceptor());
|
||||||
builder.interceptors().add(new BasicAuthenticationInterceptor());
|
|
||||||
internalClient = builder.build();
|
internalClient = builder.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -123,48 +123,5 @@ class ApOkHttpUrlLoader implements ModelLoader<String, InputStream> {
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class BasicAuthenticationInterceptor implements Interceptor {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Response intercept(Chain chain) throws IOException {
|
|
||||||
Request request = chain.request();
|
|
||||||
String url = request.url().toString();
|
|
||||||
String authentication = DBReader.getImageAuthentication(url);
|
|
||||||
|
|
||||||
if(TextUtils.isEmpty(authentication)) {
|
|
||||||
Log.d(TAG, "no credentials for '" + url + "'");
|
|
||||||
return chain.proceed(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add authentication
|
|
||||||
String[] auth = authentication.split(":");
|
|
||||||
if (auth.length != 2) {
|
|
||||||
Log.d(TAG, "Invalid credentials for '" + url + "'");
|
|
||||||
return chain.proceed(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
String credentials = HttpDownloader.encodeCredentials(auth[0], auth[1], "ISO-8859-1");
|
|
||||||
Request newRequest = request
|
|
||||||
.newBuilder()
|
|
||||||
.addHeader("Authorization", credentials)
|
|
||||||
.build();
|
|
||||||
Log.d(TAG, "Basic authentication with ISO-8859-1 encoding");
|
|
||||||
Response response = chain.proceed(newRequest);
|
|
||||||
if (!response.isSuccessful() && response.code() == HttpURLConnection.HTTP_UNAUTHORIZED) {
|
|
||||||
credentials = HttpDownloader.encodeCredentials(auth[0], auth[1], "UTF-8");
|
|
||||||
newRequest = request
|
|
||||||
.newBuilder()
|
|
||||||
.addHeader("Authorization", credentials)
|
|
||||||
.build();
|
|
||||||
Log.d(TAG, "Basic authentication with UTF-8 encoding");
|
|
||||||
return chain.proceed(newRequest);
|
|
||||||
} else {
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package de.danoeh.antennapod.core.service;
|
||||||
|
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import de.danoeh.antennapod.core.service.download.DownloadRequest;
|
||||||
|
import de.danoeh.antennapod.core.service.download.HttpDownloader;
|
||||||
|
import de.danoeh.antennapod.core.storage.DBReader;
|
||||||
|
import de.danoeh.antennapod.core.util.URIUtil;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import okhttp3.Interceptor;
|
||||||
|
import okhttp3.Request;
|
||||||
|
import okhttp3.Response;
|
||||||
|
|
||||||
|
public class BasicAuthorizationInterceptor implements Interceptor {
|
||||||
|
private static final String TAG = "BasicAuthInterceptor";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NonNull
|
||||||
|
public Response intercept(Chain chain) throws IOException {
|
||||||
|
Request request = chain.request();
|
||||||
|
|
||||||
|
Response response = chain.proceed(request);
|
||||||
|
|
||||||
|
if (response.code() != HttpURLConnection.HTTP_UNAUTHORIZED) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
String userInfo;
|
||||||
|
if (request.tag() instanceof DownloadRequest) {
|
||||||
|
DownloadRequest downloadRequest = (DownloadRequest) request.tag();
|
||||||
|
userInfo = URIUtil.getURIFromRequestUrl(downloadRequest.getSource()).getUserInfo();
|
||||||
|
if (TextUtils.isEmpty(userInfo)) {
|
||||||
|
userInfo = downloadRequest.getUsername() + ":" + downloadRequest.getPassword();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
userInfo = DBReader.getImageAuthentication(request.url().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TextUtils.isEmpty(userInfo)) {
|
||||||
|
Log.d(TAG, "no credentials for '" + request.url() + "'");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] parts = userInfo.split(":");
|
||||||
|
if (parts.length != 2) {
|
||||||
|
Log.d(TAG, "Invalid credentials for '" + request.url() + "'");
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
Request.Builder newRequest = request.newBuilder();
|
||||||
|
Log.d(TAG, "Authorization failed, re-trying with ISO-8859-1 encoded credentials");
|
||||||
|
String credentials = HttpDownloader.encodeCredentials(parts[0], parts[1], "ISO-8859-1");
|
||||||
|
newRequest.header("Authorization", credentials);
|
||||||
|
response = chain.proceed(newRequest.build());
|
||||||
|
|
||||||
|
if (response.code() != HttpURLConnection.HTTP_UNAUTHORIZED) {
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.d(TAG, "Authorization failed, re-trying with UTF-8 encoded credentials");
|
||||||
|
credentials = HttpDownloader.encodeCredentials(parts[0], parts[1], "UTF-8");
|
||||||
|
newRequest.header("Authorization", credentials);
|
||||||
|
return chain.proceed(newRequest.build());
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.CookieManager;
|
import java.net.CookieManager;
|
||||||
import java.net.CookiePolicy;
|
import java.net.CookiePolicy;
|
||||||
|
@ -112,6 +113,7 @@ public class AntennapodHttpClient {
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
});
|
});
|
||||||
|
builder.interceptors().add(new BasicAuthorizationInterceptor());
|
||||||
|
|
||||||
// set cookie handler
|
// set cookie handler
|
||||||
CookieManager cm = new CookieManager();
|
CookieManager cm = new CookieManager();
|
||||||
|
|
|
@ -4,6 +4,7 @@ import androidx.annotation.NonNull;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor;
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import java.io.BufferedInputStream;
|
import java.io.BufferedInputStream;
|
||||||
|
@ -54,9 +55,7 @@ public class HttpDownloader extends Downloader {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
OkHttpClient.Builder httpClientBuilder = AntennapodHttpClient.newBuilder();
|
OkHttpClient httpClient = AntennapodHttpClient.getHttpClient();
|
||||||
httpClientBuilder.interceptors().add(new BasicAuthorizationInterceptor(request));
|
|
||||||
OkHttpClient httpClient = httpClientBuilder.build();
|
|
||||||
RandomAccessFile out = null;
|
RandomAccessFile out = null;
|
||||||
InputStream connection;
|
InputStream connection;
|
||||||
ResponseBody responseBody = null;
|
ResponseBody responseBody = null;
|
||||||
|
@ -65,6 +64,7 @@ public class HttpDownloader extends Downloader {
|
||||||
final URI uri = URIUtil.getURIFromRequestUrl(request.getSource());
|
final URI uri = URIUtil.getURIFromRequestUrl(request.getSource());
|
||||||
Request.Builder httpReq = new Request.Builder().url(uri.toURL())
|
Request.Builder httpReq = new Request.Builder().url(uri.toURL())
|
||||||
.header("User-Agent", ClientConfig.USER_AGENT);
|
.header("User-Agent", ClientConfig.USER_AGENT);
|
||||||
|
httpReq.tag(request);
|
||||||
if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
|
if (request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
|
||||||
// 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\")");
|
||||||
|
@ -308,63 +308,4 @@ public class HttpDownloader extends Downloader {
|
||||||
throw new AssertionError(e);
|
throw new AssertionError(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class BasicAuthorizationInterceptor implements Interceptor {
|
|
||||||
|
|
||||||
private final DownloadRequest downloadRequest;
|
|
||||||
|
|
||||||
public BasicAuthorizationInterceptor(DownloadRequest downloadRequest) {
|
|
||||||
this.downloadRequest = downloadRequest;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Response intercept(Chain chain) throws IOException {
|
|
||||||
Request request = chain.request();
|
|
||||||
String userInfo = URIUtil.getURIFromRequestUrl(downloadRequest.getSource()).getUserInfo();
|
|
||||||
|
|
||||||
Response response = chain.proceed(request);
|
|
||||||
|
|
||||||
if (response.code() != HttpURLConnection.HTTP_UNAUTHORIZED) {
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
Request.Builder newRequest = request.newBuilder();
|
|
||||||
|
|
||||||
Log.d(TAG, "Authorization failed, re-trying with ISO-8859-1 encoded credentials");
|
|
||||||
if (userInfo != null) {
|
|
||||||
String[] parts = userInfo.split(":");
|
|
||||||
if (parts.length == 2) {
|
|
||||||
String credentials = encodeCredentials(parts[0], parts[1], "ISO-8859-1");
|
|
||||||
newRequest.header("Authorization", credentials);
|
|
||||||
}
|
|
||||||
} else if (!TextUtils.isEmpty(downloadRequest.getUsername()) && downloadRequest.getPassword() != null) {
|
|
||||||
String credentials = encodeCredentials(downloadRequest.getUsername(), downloadRequest.getPassword(),
|
|
||||||
"ISO-8859-1");
|
|
||||||
newRequest.header("Authorization", credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
response = chain.proceed(newRequest.build());
|
|
||||||
|
|
||||||
if (response.code() != HttpURLConnection.HTTP_UNAUTHORIZED) {
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.d(TAG, "Authorization failed, re-trying with UTF-8 encoded credentials");
|
|
||||||
if (userInfo != null) {
|
|
||||||
String[] parts = userInfo.split(":");
|
|
||||||
if (parts.length == 2) {
|
|
||||||
String credentials = encodeCredentials(parts[0], parts[1], "UTF-8");
|
|
||||||
newRequest.header("Authorization", credentials);
|
|
||||||
}
|
|
||||||
} else if (!TextUtils.isEmpty(downloadRequest.getUsername()) && downloadRequest.getPassword() != null) {
|
|
||||||
String credentials = encodeCredentials(downloadRequest.getUsername(), downloadRequest.getPassword(),
|
|
||||||
"UTF-8");
|
|
||||||
newRequest.header("Authorization", credentials);
|
|
||||||
}
|
|
||||||
|
|
||||||
return chain.proceed(newRequest.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue