From 3338adae5ab69476416d217985260a8b243f6e71 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:51:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/http/DecompressInterceptor.kt | 43 +++++++++++++++++++ .../io/legado/app/help/http/HttpHelper.kt | 38 +--------------- 2 files changed, 44 insertions(+), 37 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt diff --git a/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt b/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt new file mode 100644 index 000000000..8d2c0a422 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt @@ -0,0 +1,43 @@ +package io.legado.app.help.http + +import okhttp3.Interceptor +import okhttp3.Response +import okhttp3.ResponseBody.Companion.asResponseBody +import okhttp3.internal.http.promisesBody +import okio.buffer +import okio.source +import java.util.zip.GZIPInputStream +import java.util.zip.InflaterInputStream + +object DecompressInterceptor: Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val requestBuilder = request.newBuilder() + + var transparentDecompress = false + if (request.header("Accept-Encoding") == null && request.header("Range") == null) { + transparentDecompress = true + requestBuilder.header("Accept-Encoding", "gzip, deflate") + } + + val response = chain.proceed(requestBuilder.build()) + val body = response.body + + if (!transparentDecompress || !response.promisesBody() || body == null) { + return response + } + + val encoding = response.header("Content-Encoding")?.lowercase() + val source = when (encoding) { + "gzip" -> GZIPInputStream(body.byteStream()).source().buffer() + "deflate" -> InflaterInputStream(body.byteStream()).source().buffer() + else -> return response + } + + return response.newBuilder() + .removeHeader("Content-Encoding") + .removeHeader("Content-Length") + .body(source.asResponseBody(body.contentType(), -1)) + .build() + } +} diff --git a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt index 9c104f66b..2a7e58c0c 100644 --- a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt +++ b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt @@ -12,17 +12,12 @@ import okhttp3.Credentials import okhttp3.HttpUrl import okhttp3.Interceptor import okhttp3.OkHttpClient -import okhttp3.internal.http.RealResponseBody -import okhttp3.internal.http.promisesBody -import okio.buffer -import okio.source import java.net.InetSocketAddress import java.net.Proxy import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ThreadFactory import java.util.concurrent.ThreadPoolExecutor import java.util.concurrent.TimeUnit -import java.util.zip.GZIPInputStream private val proxyClientCache: ConcurrentHashMap by lazy { ConcurrentHashMap() @@ -107,38 +102,7 @@ val okHttpClient: OkHttpClient by lazy { } } } - builder.addInterceptor { chain -> - val request = chain.request() - val requestBuilder = request.newBuilder() - - var transparentGzip = false - if (request.header("Accept-Encoding") == null && request.header("Range") == null) { - transparentGzip = true - requestBuilder.header("Accept-Encoding", "gzip") - } - - val response = chain.proceed(requestBuilder.build()) - - val responseBody = response.body - if (transparentGzip && "gzip".equals(response.header("Content-Encoding"), ignoreCase = true) - && response.promisesBody() && responseBody != null - ) { - val responseBuilder = response.newBuilder() - val gzipSource = GZIPInputStream(responseBody.byteStream()).source() - val strippedHeaders = response.headers.newBuilder() - .removeAll("Content-Encoding") - .removeAll("Content-Length") - .build() - responseBuilder.run { - headers(strippedHeaders) - val contentType = response.header("Content-Type") - body(RealResponseBody(contentType, -1L, gzipSource.buffer())) - build() - } - } else { - response - } - } + builder.addInterceptor(DecompressInterceptor) builder.build().apply { val okHttpName = OkHttpClient::class.java.name.removePrefix("okhttp3.").removeSuffix("Client")