优化
This commit is contained in:
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -12,17 +12,12 @@ import okhttp3.Credentials
|
|||||||
import okhttp3.HttpUrl
|
import okhttp3.HttpUrl
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
import okhttp3.OkHttpClient
|
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.InetSocketAddress
|
||||||
import java.net.Proxy
|
import java.net.Proxy
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.ThreadFactory
|
import java.util.concurrent.ThreadFactory
|
||||||
import java.util.concurrent.ThreadPoolExecutor
|
import java.util.concurrent.ThreadPoolExecutor
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import java.util.zip.GZIPInputStream
|
|
||||||
|
|
||||||
private val proxyClientCache: ConcurrentHashMap<String, OkHttpClient> by lazy {
|
private val proxyClientCache: ConcurrentHashMap<String, OkHttpClient> by lazy {
|
||||||
ConcurrentHashMap()
|
ConcurrentHashMap()
|
||||||
@@ -107,38 +102,7 @@ val okHttpClient: OkHttpClient by lazy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
builder.addInterceptor { chain ->
|
builder.addInterceptor(DecompressInterceptor)
|
||||||
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.build().apply {
|
builder.build().apply {
|
||||||
val okHttpName =
|
val okHttpName =
|
||||||
OkHttpClient::class.java.name.removePrefix("okhttp3.").removeSuffix("Client")
|
OkHttpClient::class.java.name.removePrefix("okhttp3.").removeSuffix("Client")
|
||||||
|
|||||||
Reference in New Issue
Block a user