From 432a8690b1f47d58f499fddfdbbb3a9bc2e75ba1 Mon Sep 17 00:00:00 2001 From: Him188 Date: Thu, 30 Jan 2020 23:00:09 +0800 Subject: [PATCH] Fix structure end reading --- .../net/mamoe/mirai/qqandroid/io/serialization/Jce.kt | 9 ++++++--- .../qqandroid/network/QQAndroidBotNetworkHandler.kt | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt index 24d9bf645..9096ede89 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/io/serialization/Jce.kt @@ -308,10 +308,10 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo input: JceInput ) : JceDecoder(input) { override fun endStructure(desc: SerialDescriptor) { - while (input.peakHead().type != STRUCT_END) { - input.readHead() + while (input.input.canRead() && input.peakHeadOrNull()?.type != STRUCT_END) { + input.readHeadOrNull() ?: return } - input.readHead() + input.readHeadOrNull() } } @@ -513,6 +513,9 @@ class Jce private constructor(private val charset: JceCharset, context: SerialMo @PublishedApi internal fun peakHead(): JceHead = input.makeView().readHead() ?: error("no enough data to read head") + @PublishedApi + internal fun peakHeadOrNull(): JceHead? = input.makeView().readHead() + @Suppress("NOTHING_TO_INLINE") // 避免 stacktrace 出现两个 readHead private inline fun IoBuffer.readHead(): JceHead? { if (endOfInput) return null diff --git a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt index 06b9c143f..182d01d53 100644 --- a/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt +++ b/mirai-core-qqandroid/src/commonMain/kotlin/net/mamoe/mirai/qqandroid/network/QQAndroidBotNetworkHandler.kt @@ -349,7 +349,7 @@ internal class QQAndroidBotNetworkHandler(bot: QQAndroidBot) : BotNetworkHandler // 不要 `withTimeout`. timeout 的异常会不知道去哪了. } ?: net.mamoe.mirai.qqandroid.utils.inline { packetListeners.remove(handler) - error("timeout when sending $commandName") + error("timeout when receiving response of $commandName") } }