Horis 2 年 前
親
コミット
3338adae5a

+ 43 - 0
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()
+    }
+}

+ 1 - 37
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<String, OkHttpClient> 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")