From 456ef86c85dac0a136e665625a1dd130b04cc524 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Mon, 6 Oct 2025 15:17:37 -0400 Subject: [PATCH] Speeding up OkHttp startup --- .../service/okhttp/DualHttpClientManager.kt | 10 +++++----- .../service/okhttp/OkHttpClientFactory.kt | 16 +++++----------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/DualHttpClientManager.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/DualHttpClientManager.kt index ebbdb2a30..c87575f49 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/DualHttpClientManager.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/DualHttpClientManager.kt @@ -43,25 +43,25 @@ class DualHttpClientManager( keyCache: EncryptionKeyCache, scope: CoroutineScope, ) : IHttpClientManager { - val factory = OkHttpClientFactory(keyCache) + val factory = OkHttpClientFactory(keyCache, userAgent) val defaultHttpClient: StateFlow = combine(proxyPortProvider, isMobileDataProvider) { proxy, mobile -> - factory.buildHttpClient(proxy, mobile, userAgent) + factory.buildHttpClient(proxy, mobile) }.stateIn( scope, SharingStarted.WhileSubscribed(1000), - factory.buildHttpClient(proxyPortProvider.value, isMobileDataProvider.value, userAgent), + factory.buildHttpClient(proxyPortProvider.value, isMobileDataProvider.value), ) val defaultHttpClientWithoutProxy: StateFlow = isMobileDataProvider .map { mobile -> - factory.buildHttpClient(mobile, userAgent) + factory.buildHttpClient(mobile) }.stateIn( scope, SharingStarted.WhileSubscribed(1000), - factory.buildHttpClient(isMobileDataProvider.value, userAgent), + factory.buildHttpClient(isMobileDataProvider.value), ) fun getCurrentProxy(): Proxy? = defaultHttpClient.value.proxy diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/OkHttpClientFactory.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/OkHttpClientFactory.kt index 43c70ef1b..5158852f2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/OkHttpClientFactory.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/okhttp/OkHttpClientFactory.kt @@ -30,6 +30,7 @@ import java.time.Duration class OkHttpClientFactory( keyCache: EncryptionKeyCache, + val userAgent: String, ) { companion object { // by picking a random proxy port, the connection will fail as it should. @@ -74,12 +75,14 @@ class OkHttpClientFactory( .dispatcher(myDispatcher) .followRedirects(true) .followSslRedirects(true) + .addInterceptor(DefaultContentTypeInterceptor(userAgent)) + .addNetworkInterceptor(logging) + .addNetworkInterceptor(keyDecryptor) .build() fun buildHttpClient( proxy: Proxy?, timeoutSeconds: Int, - userAgent: String, ): OkHttpClient { val seconds = if (proxy != null) timeoutSeconds * 3 else timeoutSeconds return rootClient @@ -88,31 +91,22 @@ class OkHttpClientFactory( .connectTimeout(Duration.ofSeconds(seconds.toLong())) .readTimeout(Duration.ofSeconds(seconds.toLong() * 3)) .writeTimeout(Duration.ofSeconds(seconds.toLong() * 3)) - .addInterceptor(DefaultContentTypeInterceptor(userAgent)) - .addNetworkInterceptor(logging) - .addNetworkInterceptor(keyDecryptor) .build() } fun buildHttpClient( localSocksProxyPort: Int?, isMobile: Boolean?, - userAgent: String, ): OkHttpClient = buildHttpClient( buildLocalSocksProxy(localSocksProxyPort), buildTimeout(isMobile ?: DEFAULT_IS_MOBILE), - userAgent, ) - fun buildHttpClient( - isMobile: Boolean?, - userAgent: String, - ): OkHttpClient = + fun buildHttpClient(isMobile: Boolean?): OkHttpClient = buildHttpClient( null, buildTimeout(isMobile ?: DEFAULT_IS_MOBILE), - userAgent, ) fun buildTimeout(isMobile: Boolean): Int =