diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index 99ab1b9c5..1babc5c0d 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt @@ -97,6 +97,7 @@ interface BaseSource : JsExtensions { * 解析header规则 */ fun getHeaderMap(hasLoginHeader: Boolean = false) = HashMap().apply { + if (checkRhinoRecursiveCall()) return@apply header?.let { GSON.fromJsonObject>( when { diff --git a/app/src/main/java/io/legado/app/utils/RhinoContextExtensions.kt b/app/src/main/java/io/legado/app/utils/RhinoContextExtensions.kt new file mode 100644 index 000000000..fcf962e62 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/RhinoContextExtensions.kt @@ -0,0 +1,22 @@ +package io.legado.app.utils + +import org.mozilla.javascript.Context + +private val enterCountField by lazy { + Context::class.java.getDeclaredField("enterCount").apply { + isAccessible = true + } +} + +fun Context?.getEnterCount(): Int { + this ?: return 0 + return enterCountField.get(this) as Int +} + +fun checkRhinoRecursiveCall(): Boolean { + return Context.getCurrentContext().getEnterCount() > 1 +} + +fun checkRhinoCall(): Boolean { + return Context.getCurrentContext() != null +}