From 42065080ecafcd251b50ce086fe89c0294c19614 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 12 Dec 2020 18:10:10 +0800 Subject: [PATCH 1/4] update HttpHelper.kt --- .../io/legado/app/help/http/HttpHelper.kt | 32 +++++++++++-------- 1 file changed, 19 insertions(+), 13 deletions(-) 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 687057e6b..4f0ed78bd 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 @@ -6,6 +6,7 @@ import okhttp3.* import java.io.IOException import java.net.InetSocketAddress import java.net.Proxy +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -13,6 +14,10 @@ import kotlin.coroutines.resumeWithException @Suppress("unused") object HttpHelper { + private val proxyClientCache: ConcurrentHashMap by lazy { + ConcurrentHashMap() + } + val client: OkHttpClient by lazy { val specs = arrayListOf( @@ -55,31 +60,30 @@ object HttpHelper { }) } + /** + * 缓存代理okHttp + */ fun getProxyClient(proxy: String? = null): OkHttpClient { if (proxy.isNullOrBlank()) { return client } + proxyClientCache[proxy]?.let { + return it + } val r = Regex("(http|socks4|socks5)://(.*):(\\d{2,5})(@.*@.*)?") val ms = r.findAll(proxy) val group = ms.first() - val type: String //直接连接 - val host: String //代理服务器hostname - val port: Int //代理服务器port var username = "" //代理服务器验证用户名 var password = "" //代理服务器验证密码 - type = if (group.groupValues[1] == "http") { - "http" - } else { - "socks" - } - host = group.groupValues[2] - port = group.groupValues[3].toInt() + val type = if (group.groupValues[1] == "http") "http" else "socks" + val host = group.groupValues[2] + val port = group.groupValues[3].toInt() if (group.groupValues[4] != "") { username = group.groupValues[4].split("@")[1] password = group.groupValues[4].split("@")[2] } - val builder = client.newBuilder() if (type != "direct" && host != "") { + val builder = client.newBuilder() if (type == "http") { builder.proxy(Proxy(Proxy.Type.HTTP, InetSocketAddress(host, port))) } else { @@ -93,9 +97,11 @@ object HttpHelper { .build() } } - + val proxyClient = builder.build() + proxyClientCache[proxy] = proxyClient + return proxyClient } - return builder.build() + return client } private fun getHeaderInterceptor(): Interceptor { From 707f19552effddcabe7bb304c840a66f178b1017 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 12 Dec 2020 18:26:41 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=9A=84=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 - .../io/legado/app/help/http/CookieStore.kt | 34 ++----------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 550d06afc..346d88e3e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -174,7 +174,6 @@ dependencies { //网络 implementation 'com.ljx.rxhttp:rxhttp:2.4.4-beta3' implementation 'com.squareup.okhttp3:okhttp:4.9.0' - implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1' kapt 'com.ljx.rxhttp:rxhttp-compiler:2.4.4-beta3' //Glide diff --git a/app/src/main/java/io/legado/app/help/http/CookieStore.kt b/app/src/main/java/io/legado/app/help/http/CookieStore.kt index 8c4aa34ec..9aa344dbb 100644 --- a/app/src/main/java/io/legado/app/help/http/CookieStore.kt +++ b/app/src/main/java/io/legado/app/help/http/CookieStore.kt @@ -3,14 +3,12 @@ package io.legado.app.help.http import android.text.TextUtils -import com.franmontiel.persistentcookiejar.persistence.CookiePersistor -import com.franmontiel.persistentcookiejar.persistence.SerializableCookie import io.legado.app.App import io.legado.app.data.entities.Cookie import io.legado.app.help.http.api.CookieManager import io.legado.app.utils.NetworkUtils -object CookieStore : CookiePersistor, CookieManager { +object CookieStore : CookieManager { override fun setCookie(url: String, cookie: String?) { val cookieBean = Cookie(NetworkUtils.getSubDomain(url), cookie ?: "") @@ -78,36 +76,8 @@ object CookieStore : CookiePersistor, CookieManager { return builder.deleteCharAt(builder.lastIndexOf(";")).toString() } - override fun loadAll(): MutableList { - val cookies = arrayListOf() - App.db.cookieDao.getOkHttpCookies().forEach { - val serializedCookie = it.cookie - SerializableCookie().decode(serializedCookie)?.let { ck -> - cookies.add(ck) - } - } - return cookies - } - - override fun saveAll(cookies: MutableCollection?) { - val mCookies = arrayListOf() - cookies?.forEach { - mCookies.add(Cookie(createCookieKey(it), SerializableCookie().encode(it))) - } - App.db.cookieDao.insert(*mCookies.toTypedArray()) - } - - override fun removeAll(cookies: MutableCollection?) { - cookies?.forEach { - App.db.cookieDao.delete(createCookieKey(it)) - } - } - - override fun clear() { + fun clear() { App.db.cookieDao.deleteOkHttp() } - private fun createCookieKey(cookie: okhttp3.Cookie): String { - return (if (cookie.secure) "https" else "http") + "://" + cookie.domain + cookie.path + "|" + cookie.name - } } \ No newline at end of file From 3d65cd8a8fd001526f3aa5a8cbca32a66b8dcec6 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 12 Dec 2020 18:40:17 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/http/HttpHelper.kt | 20 -------------- .../java/io/legado/app/lib/webdav/WebDav.kt | 5 ++-- .../io/legado/app/utils/OkHttpExtensions.kt | 27 +++++++++++++++++++ 3 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/OkHttpExtensions.kt 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 4f0ed78bd..0b83c0616 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 @@ -3,13 +3,11 @@ package io.legado.app.help.http import io.legado.app.utils.msg import kotlinx.coroutines.suspendCancellableCoroutine import okhttp3.* -import java.io.IOException import java.net.InetSocketAddress import java.net.Proxy import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException @Suppress("unused") object HttpHelper { @@ -42,24 +40,6 @@ object HttpHelper { builder.build() } - suspend fun awaitResponse(request: Request): Response = suspendCancellableCoroutine { block -> - val call = client.newCall(request) - - block.invokeOnCancellation { - call.cancel() - } - - call.enqueue(object : Callback { - override fun onFailure(call: Call, e: IOException) { - block.resumeWithException(e) - } - - override fun onResponse(call: Call, response: Response) { - block.resume(response) - } - }) - } - /** * 缓存代理okHttp */ diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 4b7738308..cfcf094ad 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -1,6 +1,7 @@ package io.legado.app.lib.webdav import io.legado.app.help.http.HttpHelper +import io.legado.app.utils.await import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.asRequestBody @@ -119,7 +120,7 @@ class WebDav(urlStr: String) { request.header("Authorization", Credentials.basic(it.user, it.pass)) } request.header("Depth", if (depth < 0) "infinity" else depth.toString()) - return HttpHelper.awaitResponse(request.build()) + return HttpHelper.client.newCall(request.build()).await() } return null } @@ -233,7 +234,7 @@ class WebDav(urlStr: String) { HttpAuth.auth?.let { requestBuilder.header("Authorization", Credentials.basic(it.user, it.pass)) } - val response = HttpHelper.awaitResponse(requestBuilder.build()) + val response = HttpHelper.client.newCall(requestBuilder.build()).await() return response.isSuccessful } diff --git a/app/src/main/java/io/legado/app/utils/OkHttpExtensions.kt b/app/src/main/java/io/legado/app/utils/OkHttpExtensions.kt new file mode 100644 index 000000000..b21bcc8e4 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/OkHttpExtensions.kt @@ -0,0 +1,27 @@ +package io.legado.app.utils + +import kotlinx.coroutines.suspendCancellableCoroutine +import okhttp3.Call +import okhttp3.Callback +import okhttp3.Response +import java.io.IOException +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException + +suspend fun Call.await(): Response = suspendCancellableCoroutine { block -> + + block.invokeOnCancellation { + cancel() + } + + enqueue(object : Callback { + override fun onFailure(call: Call, e: IOException) { + block.resumeWithException(e) + } + + override fun onResponse(call: Call, response: Response) { + block.resume(response) + } + }) + +} \ No newline at end of file From e04efe22933412d7b6e5d0c5e45ff1136a50ddcb Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 12 Dec 2020 18:50:40 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B9=A6=E6=BA=90?= =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/association/ImportBookSourceDialog.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt index e4ba2f0c5..ef89a5097 100644 --- a/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/ImportBookSourceDialog.kt @@ -141,12 +141,12 @@ class ImportBookSourceDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickList binding.apply { cbSourceName.isChecked = viewModel.selectStatus[holder.layoutPosition] cbSourceName.text = item.bookSourceName - tvSourceState.text = - if (viewModel.checkSources[holder.layoutPosition] != null) { - "已存在" - } else { - "新书源" - } + val localSource = viewModel.checkSources[holder.layoutPosition] + tvSourceState.text = when { + localSource == null -> "新书源" + item.lastUpdateTime > localSource.lastUpdateTime -> "更新" + else -> "已存在" + } } }