Horis hace 1 año
padre
commit
a149f2cf54

+ 13 - 10
app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt

@@ -4,7 +4,8 @@ import android.annotation.SuppressLint
 import android.util.Base64
 import androidx.annotation.Keep
 import androidx.media3.common.MediaItem
-import cn.hutool.core.net.URLEncodeUtil
+import cn.hutool.core.codec.PercentCodec
+import cn.hutool.core.net.RFC3986
 import cn.hutool.core.util.HexUtil
 import com.bumptech.glide.load.model.GlideUrl
 import com.script.buildScriptBindings
@@ -90,6 +91,8 @@ class AnalyzeUrl(
     companion object {
         val paramPattern: Pattern = Pattern.compile("\\s*,\\s*(?=\\{)")
         private val pagePattern = Pattern.compile("<(.*?)>")
+        private val queryEncoder =
+            RFC3986.UNRESERVED.orNew(PercentCodec.of("!$%&()*+,/:;=?@[\\]^`{|}"))
     }
 
     var ruleUrl = ""
@@ -286,6 +289,12 @@ class AnalyzeUrl(
             charset == "escape" -> null
             else -> charset(charset)
         }
+        if (isQuery && charset != null) {
+            if (NetworkUtils.encodedQuery(params)) {
+                return params
+            }
+            return queryEncoder.encode(params, charset)
+        }
         val len = params.length
         val sb = StringBuilder()
         var pos = 0
@@ -307,10 +316,10 @@ class AnalyzeUrl(
                 key = params.substring(pos, eqOffset)
                 value = params.substring(eqOffset + 1, ampOffset)
             }
-            sb.appendEncoded(key, isQuery, checkEncoded, charset)
+            sb.appendEncoded(key, checkEncoded, charset)
             if (value != null) {
                 sb.append("=")
-                sb.appendEncoded(value, isQuery, checkEncoded, charset)
+                sb.appendEncoded(value, checkEncoded, charset)
             }
             pos = ampOffset + 1
         }
@@ -319,19 +328,13 @@ class AnalyzeUrl(
 
     private fun StringBuilder.appendEncoded(
         value: String,
-        isQuery: Boolean,
         checkEncoded: Boolean,
         charset: Charset?
     ) {
-        if (checkEncoded &&
-            !((isQuery && !NetworkUtils.encodedQuery(value)) ||
-                    (!isQuery && !NetworkUtils.encodedForm(value)))
-        ) {
+        if (checkEncoded && NetworkUtils.encodedForm(value)) {
             append(value)
         } else if (charset == null) {
             append(EncoderUtils.escape(value))
-        } else if (isQuery) {
-            append(URLEncodeUtil.encodeQuery(value, charset))
         } else {
             append(URLEncoder.encode(value, charset))
         }

+ 1 - 1
app/src/main/java/io/legado/app/ui/book/changesource/ChangeBookSourceViewModel.kt

@@ -247,8 +247,8 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
                     index + 1 to value.bookSourceName
                 }
             }.onCompletion {
-                searchStateData.postValue(false)
                 ensureActive()
+                searchStateData.postValue(false)
                 searchFinishCallback?.invoke(searchBooks.isEmpty())
             }.catch {
                 AppLog.put("换源搜索出错\n${it.localizedMessage}", it)