From d339729baf8aae30e40d65e520f0886f2637d84e Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sun, 24 Apr 2022 23:21:27 +0200 Subject: Decouple HttpClient Remove dependencies: - HttpClient->Preferences - AuthorizationInterceptor->Download Service - ExoPlayer->Download Service --- .../java/de/danoeh/antennapod/core/ClientConfig.java | 1 + .../core/service/BasicAuthorizationInterceptor.java | 8 +++----- .../core/service/download/AntennapodHttpClient.java | 19 +++++++++++-------- .../core/service/download/HttpCredentialEncoder.java | 18 ++++++++++++++++++ .../core/service/download/HttpDownloader.java | 13 ------------- .../core/service/playback/ExoPlayerWrapper.java | 4 ++-- 6 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 core/src/main/java/de/danoeh/antennapod/core/service/download/HttpCredentialEncoder.java (limited to 'core/src/main/java/de/danoeh') diff --git a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java index e03c8118d..86326911d 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java +++ b/core/src/main/java/de/danoeh/antennapod/core/ClientConfig.java @@ -43,6 +43,7 @@ public class ClientConfig { SslProviderInstaller.install(context); NetworkUtils.init(context); AntennapodHttpClient.setCacheDirectory(new File(context.getCacheDir(), "okhttp")); + AntennapodHttpClient.setProxyConfig(UserPreferences.getProxyConfig()); SleepTimerPreferences.init(context); NotificationUtils.createChannels(context); initialized = true; diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/BasicAuthorizationInterceptor.java b/core/src/main/java/de/danoeh/antennapod/core/service/BasicAuthorizationInterceptor.java index fff2eb25b..bea064cf1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/BasicAuthorizationInterceptor.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/BasicAuthorizationInterceptor.java @@ -4,7 +4,7 @@ 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.service.download.HttpCredentialEncoder; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.URIUtil; import java.io.IOException; @@ -67,8 +67,7 @@ public class BasicAuthorizationInterceptor implements Interceptor { String password = userInfo.substring(userInfo.indexOf(':') + 1); Log.d(TAG, "Authorization failed, re-trying with ISO-8859-1 encoded credentials"); - String credentials = HttpDownloader.encodeCredentials(username, password, "ISO-8859-1"); - newRequest.header(HEADER_AUTHORIZATION, credentials); + newRequest.header(HEADER_AUTHORIZATION, HttpCredentialEncoder.encode(username, password, "ISO-8859-1")); response = chain.proceed(newRequest.build()); if (response.code() != HttpURLConnection.HTTP_UNAUTHORIZED) { @@ -76,8 +75,7 @@ public class BasicAuthorizationInterceptor implements Interceptor { } Log.d(TAG, "Authorization failed, re-trying with UTF-8 encoded credentials"); - credentials = HttpDownloader.encodeCredentials(username, password, "UTF-8"); - newRequest.header(HEADER_AUTHORIZATION, credentials); + newRequest.header(HEADER_AUTHORIZATION, HttpCredentialEncoder.encode(username, password, "UTF-8")); return chain.proceed(newRequest.build()); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java index b1138eeff..25ed6b2ec 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/AntennapodHttpClient.java @@ -3,7 +3,6 @@ package de.danoeh.antennapod.core.service.download; import android.text.TextUtils; import android.util.Log; import androidx.annotation.NonNull; -import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.BasicAuthorizationInterceptor; import de.danoeh.antennapod.core.service.UserAgentInterceptor; import de.danoeh.antennapod.net.ssl.SslClientSetup; @@ -28,6 +27,7 @@ public class AntennapodHttpClient { private static final int READ_TIMEOUT = 30000; private static final int MAX_CONNECTIONS = 8; private static File cacheDirectory; + private static ProxyConfig proxyConfig; private static volatile OkHttpClient httpClient = null; @@ -81,14 +81,13 @@ public class AntennapodHttpClient { builder.followRedirects(true); builder.followSslRedirects(true); - ProxyConfig config = UserPreferences.getProxyConfig(); - if (config.type != Proxy.Type.DIRECT && !TextUtils.isEmpty(config.host)) { - int port = config.port > 0 ? config.port : ProxyConfig.DEFAULT_PORT; - SocketAddress address = InetSocketAddress.createUnresolved(config.host, port); - builder.proxy(new Proxy(config.type, address)); - if (!TextUtils.isEmpty(config.username) && config.password != null) { + if (proxyConfig != null && proxyConfig.type != Proxy.Type.DIRECT && !TextUtils.isEmpty(proxyConfig.host)) { + int port = proxyConfig.port > 0 ? proxyConfig.port : ProxyConfig.DEFAULT_PORT; + SocketAddress address = InetSocketAddress.createUnresolved(proxyConfig.host, port); + builder.proxy(new Proxy(proxyConfig.type, address)); + if (!TextUtils.isEmpty(proxyConfig.username) && proxyConfig.password != null) { builder.proxyAuthenticator((route, response) -> { - String credentials = Credentials.basic(config.username, config.password); + String credentials = Credentials.basic(proxyConfig.username, proxyConfig.password); return response.request().newBuilder() .header("Proxy-Authorization", credentials) .build(); @@ -103,4 +102,8 @@ public class AntennapodHttpClient { public static void setCacheDirectory(File cacheDirectory) { AntennapodHttpClient.cacheDirectory = cacheDirectory; } + + public static void setProxyConfig(ProxyConfig proxyConfig) { + AntennapodHttpClient.proxyConfig = proxyConfig; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpCredentialEncoder.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpCredentialEncoder.java new file mode 100644 index 000000000..c1b63e873 --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpCredentialEncoder.java @@ -0,0 +1,18 @@ +package de.danoeh.antennapod.core.service.download; + +import okio.ByteString; + +import java.io.UnsupportedEncodingException; + +public abstract class HttpCredentialEncoder { + public static String encode(String username, String password, String charset) { + try { + String credentials = username + ":" + password; + byte[] bytes = credentials.getBytes(charset); + String encoded = ByteString.of(bytes).base64(); + return "Basic " + encoded; + } catch (UnsupportedEncodingException e) { + throw new AssertionError(e); + } + } +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java index 2393cedef..3238ce5f1 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/HttpDownloader.java @@ -15,7 +15,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; -import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.SocketTimeoutException; import java.net.URI; @@ -35,7 +34,6 @@ import okhttp3.Protocol; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; -import okio.ByteString; public class HttpDownloader extends Downloader { private static final String TAG = "HttpDownloader"; @@ -338,15 +336,4 @@ public class HttpDownloader extends Downloader { } } } - - public static String encodeCredentials(String username, String password, String charset) { - try { - String credentials = username + ":" + password; - byte[] bytes = credentials.getBytes(charset); - String encoded = ByteString.of(bytes).base64(); - return "Basic " + encoded; - } catch (UnsupportedEncodingException e) { - throw new AssertionError(e); - } - } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java index 0c64ea2b3..37f49a416 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/ExoPlayerWrapper.java @@ -38,7 +38,7 @@ import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.R; import de.danoeh.antennapod.core.preferences.UserPreferences; import de.danoeh.antennapod.core.service.download.AntennapodHttpClient; -import de.danoeh.antennapod.core.service.download.HttpDownloader; +import de.danoeh.antennapod.core.service.download.HttpCredentialEncoder; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.playback.IPlayer; import de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer; @@ -222,7 +222,7 @@ public class ExoPlayerWrapper implements IPlayer { final HashMap requestProperties = new HashMap<>(); requestProperties.put( "Authorization", - HttpDownloader.encodeCredentials(user, password, "ISO-8859-1") + HttpCredentialEncoder.encode(user, password, "ISO-8859-1") ); httpDataSourceFactory.setDefaultRequestProperties(requestProperties); } -- cgit v1.2.3