|
|
|
@ -1,12 +1,12 @@ |
|
|
|
|
package io.legado.app.help.http.cronet |
|
|
|
|
|
|
|
|
|
import android.os.Build |
|
|
|
|
import io.legado.app.help.http.CookieStore |
|
|
|
|
import io.legado.app.utils.printOnDebug |
|
|
|
|
import okhttp3.* |
|
|
|
|
import okhttp3.internal.http.receiveHeaders |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CronetInterceptor(private val cookieJar: CookieJar?) : Interceptor { |
|
|
|
|
class CronetInterceptor(private val cookieJar: CookieJar = CookieJar.NO_COOKIES) : Interceptor { |
|
|
|
|
|
|
|
|
|
override fun intercept(chain: Interceptor.Chain): Response { |
|
|
|
|
val original: Request = chain.request() |
|
|
|
@ -18,15 +18,18 @@ class CronetInterceptor(private val cookieJar: CookieJar?) : Interceptor { |
|
|
|
|
//移除Keep-Alive,手动设置会导致400 BadRequest |
|
|
|
|
builder.removeHeader("Keep-Alive") |
|
|
|
|
builder.removeHeader("Accept-Encoding") |
|
|
|
|
val cookieStr = getCookie(original.url) |
|
|
|
|
//设置Cookie |
|
|
|
|
if (cookieStr.length > 3) { |
|
|
|
|
builder.header("Cookie", cookieStr) |
|
|
|
|
if (cookieJar != CookieJar.NO_COOKIES) { |
|
|
|
|
val cookieStr = getCookie(original.url) |
|
|
|
|
//设置Cookie |
|
|
|
|
if (cookieStr.length > 3) { |
|
|
|
|
builder.addHeader("Cookie", cookieStr) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
val new = builder.build() |
|
|
|
|
proceedWithCronet(new, chain.call())?.let { response -> |
|
|
|
|
|
|
|
|
|
val newReq = builder.build() |
|
|
|
|
proceedWithCronet(newReq, chain.call())?.let { response -> |
|
|
|
|
//从Response 中保存Cookie到CookieJar |
|
|
|
|
cookieJar?.saveFromResponse(new.url, Cookie.parseAll(new.url, response.headers)) |
|
|
|
|
cookieJar.receiveHeaders(newReq.url, response.headers) |
|
|
|
|
response |
|
|
|
|
} ?: chain.proceed(original) |
|
|
|
|
} catch (e: Exception) { |
|
|
|
@ -54,21 +57,14 @@ class CronetInterceptor(private val cookieJar: CookieJar?) : Interceptor { |
|
|
|
|
return null |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private fun getCookie(url: HttpUrl): String { |
|
|
|
|
val sb = StringBuilder() |
|
|
|
|
//处理从 Cookiejar 获取到的Cookies |
|
|
|
|
if (cookieJar != null) { |
|
|
|
|
val cookies = cookieJar.loadForRequest(url) |
|
|
|
|
for (cookie in cookies) { |
|
|
|
|
sb.append(cookie.name).append("=").append(cookie.value).append("; ") |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//处理自定义的Cookie |
|
|
|
|
val cookie = CookieStore.getCookie(url.toString()) |
|
|
|
|
if (cookie.length > 3) { |
|
|
|
|
sb.append(cookie) |
|
|
|
|
|
|
|
|
|
/** Returns a 'Cookie' HTTP request header with all cookies, like `a=b; c=d`. */ |
|
|
|
|
private fun getCookie(url: HttpUrl): String = buildString { |
|
|
|
|
val cookies = cookieJar.loadForRequest(url) |
|
|
|
|
cookies.forEachIndexed { index, cookie -> |
|
|
|
|
if (index > 0) append("; ") |
|
|
|
|
append(cookie.name).append('=').append(cookie.value) |
|
|
|
|
} |
|
|
|
|
return sb.toString() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|