mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Prevent okhttp from caching covers and chapter images (#7967)
This commit is contained in:
		@@ -11,7 +11,6 @@ import eu.kanade.domain.manga.model.Manga as DomainManga
 | 
			
		||||
/**
 | 
			
		||||
 * Class used to create cover cache.
 | 
			
		||||
 * It is used to store the covers of the library.
 | 
			
		||||
 * Makes use of Glide (which can avoid repeating requests) to download covers.
 | 
			
		||||
 * Names of files are created with the md5 of the thumbnail URL.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context the application context.
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ import eu.kanade.domain.manga.model.MangaCover
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.CoverCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.coil.MangaCoverFetcher.Companion.USE_CUSTOM_COVER
 | 
			
		||||
import eu.kanade.tachiyomi.data.database.models.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.network.CACHE_CONTROL_NO_STORE
 | 
			
		||||
import eu.kanade.tachiyomi.network.await
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import eu.kanade.tachiyomi.source.online.HttpSource
 | 
			
		||||
@@ -23,14 +24,13 @@ import okhttp3.CacheControl
 | 
			
		||||
import okhttp3.Call
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import okhttp3.internal.closeQuietly
 | 
			
		||||
import okhttp3.internal.http.HTTP_NOT_MODIFIED
 | 
			
		||||
import okio.Path.Companion.toOkioPath
 | 
			
		||||
import okio.Source
 | 
			
		||||
import okio.buffer
 | 
			
		||||
import okio.sink
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.io.File
 | 
			
		||||
import java.net.HttpURLConnection
 | 
			
		||||
import eu.kanade.domain.manga.model.Manga as DomainManga
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -125,7 +125,7 @@ class MangaCoverFetcher(
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // Read from disk cache
 | 
			
		||||
                snapshot = writeToDiskCache(snapshot, response)
 | 
			
		||||
                snapshot = writeToDiskCache(response)
 | 
			
		||||
                if (snapshot != null) {
 | 
			
		||||
                    return SourceResult(
 | 
			
		||||
                        source = snapshot.toImageSource(),
 | 
			
		||||
@@ -141,11 +141,11 @@ class MangaCoverFetcher(
 | 
			
		||||
                    dataSource = if (response.cacheResponse != null) DataSource.DISK else DataSource.NETWORK,
 | 
			
		||||
                )
 | 
			
		||||
            } catch (e: Exception) {
 | 
			
		||||
                responseBody.closeQuietly()
 | 
			
		||||
                responseBody.close()
 | 
			
		||||
                throw e
 | 
			
		||||
            }
 | 
			
		||||
        } catch (e: Exception) {
 | 
			
		||||
            snapshot?.closeQuietly()
 | 
			
		||||
            snapshot?.close()
 | 
			
		||||
            throw e
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -153,8 +153,8 @@ class MangaCoverFetcher(
 | 
			
		||||
    private suspend fun executeNetworkRequest(): Response {
 | 
			
		||||
        val client = sourceLazy.value?.client ?: callFactoryLazy.value
 | 
			
		||||
        val response = client.newCall(newRequest()).await()
 | 
			
		||||
        if (!response.isSuccessful && response.code != HttpURLConnection.HTTP_NOT_MODIFIED) {
 | 
			
		||||
            response.body?.closeQuietly()
 | 
			
		||||
        if (!response.isSuccessful && response.code != HTTP_NOT_MODIFIED) {
 | 
			
		||||
            response.close()
 | 
			
		||||
            throw HttpException(response)
 | 
			
		||||
        }
 | 
			
		||||
        return response
 | 
			
		||||
@@ -167,18 +167,12 @@ class MangaCoverFetcher(
 | 
			
		||||
            // Support attaching custom data to the network request.
 | 
			
		||||
            .tag(Parameters::class.java, options.parameters)
 | 
			
		||||
 | 
			
		||||
        val diskRead = options.diskCachePolicy.readEnabled
 | 
			
		||||
        val networkRead = options.networkCachePolicy.readEnabled
 | 
			
		||||
        when {
 | 
			
		||||
            !networkRead && diskRead -> {
 | 
			
		||||
                request.cacheControl(CacheControl.FORCE_CACHE)
 | 
			
		||||
            options.networkCachePolicy.readEnabled -> {
 | 
			
		||||
                // don't take up okhttp cache
 | 
			
		||||
                request.cacheControl(CACHE_CONTROL_NO_STORE)
 | 
			
		||||
            }
 | 
			
		||||
            networkRead && !diskRead -> if (options.diskCachePolicy.writeEnabled) {
 | 
			
		||||
                request.cacheControl(CacheControl.FORCE_NETWORK)
 | 
			
		||||
            } else {
 | 
			
		||||
                request.cacheControl(CACHE_CONTROL_FORCE_NETWORK_NO_CACHE)
 | 
			
		||||
            }
 | 
			
		||||
            !networkRead && !diskRead -> {
 | 
			
		||||
            else -> {
 | 
			
		||||
                // This causes the request to fail with a 504 Unsatisfiable Request.
 | 
			
		||||
                request.cacheControl(CACHE_CONTROL_NO_NETWORK_NO_CACHE)
 | 
			
		||||
            }
 | 
			
		||||
@@ -234,18 +228,9 @@ class MangaCoverFetcher(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun writeToDiskCache(
 | 
			
		||||
        snapshot: DiskCache.Snapshot?,
 | 
			
		||||
        response: Response,
 | 
			
		||||
    ): DiskCache.Snapshot? {
 | 
			
		||||
        if (!options.diskCachePolicy.writeEnabled) {
 | 
			
		||||
            snapshot?.closeQuietly()
 | 
			
		||||
            return null
 | 
			
		||||
        }
 | 
			
		||||
        val editor = if (snapshot != null) {
 | 
			
		||||
            snapshot.closeAndEdit()
 | 
			
		||||
        } else {
 | 
			
		||||
            diskCacheLazy.value.edit(diskCacheKey)
 | 
			
		||||
        } ?: return null
 | 
			
		||||
        val editor = diskCacheLazy.value.edit(diskCacheKey) ?: return null
 | 
			
		||||
        try {
 | 
			
		||||
            diskCacheLazy.value.fileSystem.write(editor.data) {
 | 
			
		||||
                response.body!!.source().readAll(this)
 | 
			
		||||
@@ -349,7 +334,6 @@ class MangaCoverFetcher(
 | 
			
		||||
    companion object {
 | 
			
		||||
        const val USE_CUSTOM_COVER = "use_custom_cover"
 | 
			
		||||
 | 
			
		||||
        private val CACHE_CONTROL_FORCE_NETWORK_NO_CACHE = CacheControl.Builder().noCache().noStore().build()
 | 
			
		||||
        private val CACHE_CONTROL_NO_NETWORK_NO_CACHE = CacheControl.Builder().noCache().onlyIfCached().build()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -10,6 +10,7 @@ import java.util.concurrent.TimeUnit.MINUTES
 | 
			
		||||
private val DEFAULT_CACHE_CONTROL = CacheControl.Builder().maxAge(10, MINUTES).build()
 | 
			
		||||
private val DEFAULT_HEADERS = Headers.Builder().build()
 | 
			
		||||
private val DEFAULT_BODY: RequestBody = FormBody.Builder().build()
 | 
			
		||||
internal val CACHE_CONTROL_NO_STORE = CacheControl.Builder().noStore().build()
 | 
			
		||||
 | 
			
		||||
fun GET(
 | 
			
		||||
    url: String,
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.source.online
 | 
			
		||||
 | 
			
		||||
import eu.kanade.tachiyomi.network.CACHE_CONTROL_NO_STORE
 | 
			
		||||
import eu.kanade.tachiyomi.network.GET
 | 
			
		||||
import eu.kanade.tachiyomi.network.NetworkHelper
 | 
			
		||||
import eu.kanade.tachiyomi.network.asObservableSuccess
 | 
			
		||||
@@ -15,7 +16,6 @@ import okhttp3.OkHttpClient
 | 
			
		||||
import okhttp3.Request
 | 
			
		||||
import okhttp3.Response
 | 
			
		||||
import rx.Observable
 | 
			
		||||
import uy.kohesive.injekt.api.get
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
import java.net.URI
 | 
			
		||||
import java.net.URISyntaxException
 | 
			
		||||
@@ -301,7 +301,11 @@ abstract class HttpSource : CatalogueSource {
 | 
			
		||||
     * @param page the page whose source image has to be downloaded.
 | 
			
		||||
     */
 | 
			
		||||
    fun fetchImage(page: Page): Observable<Response> {
 | 
			
		||||
        return client.newCallWithProgress(imageRequest(page), page)
 | 
			
		||||
        val request = imageRequest(page).newBuilder()
 | 
			
		||||
            // images will be cached or saved manually, so don't take up network cache
 | 
			
		||||
            .cacheControl(CACHE_CONTROL_NO_STORE)
 | 
			
		||||
            .build()
 | 
			
		||||
        return client.newCallWithProgress(request, page)
 | 
			
		||||
            .asObservableSuccess()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user