httpclient: Configure basic caching using okhttp

Signed-off-by: Aayush Gupta <aayushgupta219@gmail.com>
This commit is contained in:
Aayush Gupta
2025-10-12 13:29:29 +08:00
parent 835f153ac1
commit 1276528cce
2 changed files with 20 additions and 3 deletions

View File

@@ -171,8 +171,9 @@ class HttpClient @Inject constructor(private val okHttpClient: OkHttpClient): IH
responseBytes = response.body.bytes(), responseBytes = response.body.bytes(),
errorString = if (!response.isSuccessful) response.message else String() errorString = if (!response.isSuccessful) response.message else String()
).also { ).also {
val isCached = if (response.cacheResponse != null) "CACHED" else "NETWORK"
_responseCode.value = response.code _responseCode.value = response.code
Log.i(TAG, "OKHTTP [${response.code}] ${response.request.url}") Log.i(TAG, "OKHTTP [$isCached] [${response.code}] ${response.request.url}")
} }
} }
} }

View File

@@ -34,9 +34,11 @@ import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent import dagger.hilt.components.SingletonComponent
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.Cache
import okhttp3.CertificatePinner import okhttp3.CertificatePinner
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
import java.io.File
import java.io.InputStream import java.io.InputStream
import java.net.Authenticator import java.net.Authenticator
import java.net.InetSocketAddress import java.net.InetSocketAddress
@@ -59,8 +61,13 @@ object OkHttpClientModule {
@Provides @Provides
@Singleton @Singleton
fun providesOkHttpClientInstance(certPinner: CertificatePinner, proxy: Proxy?): OkHttpClient { fun providesOkHttpClientInstance(
certificatePinner: CertificatePinner,
proxy: Proxy?,
cache: Cache
): OkHttpClient {
val okHttpClientBuilder = OkHttpClient().newBuilder() val okHttpClientBuilder = OkHttpClient().newBuilder()
.cache(cache)
.proxy(proxy) .proxy(proxy)
.connectTimeout(25, TimeUnit.SECONDS) .connectTimeout(25, TimeUnit.SECONDS)
.readTimeout(25, TimeUnit.SECONDS) .readTimeout(25, TimeUnit.SECONDS)
@@ -70,7 +77,7 @@ object OkHttpClientModule {
.followSslRedirects(true) .followSslRedirects(true)
if (!BuildConfig.DEBUG) { if (!BuildConfig.DEBUG) {
okHttpClientBuilder.certificatePinner(certPinner) okHttpClientBuilder.certificatePinner(certificatePinner)
} }
return okHttpClientBuilder.build() return okHttpClientBuilder.build()
@@ -122,6 +129,15 @@ object OkHttpClientModule {
} }
} }
@Provides
@Singleton
fun providesCacheDir(@ApplicationContext context: Context): Cache {
return Cache(
directory = File(context.cacheDir, "http_cache"),
maxSize = 100L * 1024 * 1024
)
}
private fun getGoogleRootCertHashes(context: Context): List<String> { private fun getGoogleRootCertHashes(context: Context): List<String> {
return try { return try {
val certs = getX509Certificates(context.resources.openRawResource(R.raw.google_roots_ca)) val certs = getX509Certificates(context.resources.openRawResource(R.raw.google_roots_ca))