فهرست منبع

Merge branch 'dev1.7.4'

ryoii 5 سال پیش
والد
کامیت
b09938946e

+ 8 - 0
CHANGELOG.md

@@ -1,6 +1,14 @@
 # 更新日志
 
 
+## \[1.7.4\] - 2020-07-31
+
+### 变更
+
+* 默认使用 `UTF-8` 编码解析 HTTP 请求
+
+
+
 ## \[1.7.3\] - 2020-07-9
 
 ### 变更

+ 1 - 1
gradle.properties

@@ -1,5 +1,5 @@
 # build
-httpVersion=v1.7.3
+httpVersion=v1.7.4
 # style guide
 kotlin.code.style=official
 # config

+ 11 - 1
mirai-api-http/src/main/kotlin/net/mamoe/mirai/api/http/route/BaseRoute.kt

@@ -22,7 +22,9 @@ import io.ktor.http.HttpMethod
 import io.ktor.http.HttpStatusCode
 import io.ktor.http.content.PartData
 import io.ktor.http.content.readAllParts
+import io.ktor.request.contentCharset
 import io.ktor.request.receive
+import io.ktor.request.receiveChannel
 import io.ktor.request.receiveMultipart
 import io.ktor.response.defaultTextContentType
 import io.ktor.response.respond
@@ -31,6 +33,8 @@ import io.ktor.routing.Route
 import io.ktor.routing.route
 import io.ktor.util.pipeline.ContextDsl
 import io.ktor.util.pipeline.PipelineContext
+import io.ktor.utils.io.readRemaining
+import io.ktor.utils.io.streams.inputStream
 import io.ktor.websocket.WebSockets
 import net.mamoe.mirai.api.http.AuthedSession
 import net.mamoe.mirai.api.http.HttpApiPluginBase
@@ -45,6 +49,7 @@ import net.mamoe.mirai.contact.BotIsBeingMutedException
 import net.mamoe.mirai.contact.MessageTooLargeException
 import net.mamoe.mirai.contact.PermissionDeniedException
 import org.slf4j.helpers.NOPLoggerFactory
+import java.nio.charset.Charset
 import kotlin.time.DurationUnit
 import kotlin.time.ExperimentalTime
 import kotlin.time.toDuration
@@ -204,7 +209,12 @@ internal suspend inline fun <reified T : DTO> ApplicationCall.respondDTO(dto: T,
 internal suspend fun ApplicationCall.respondJson(json: String, status: HttpStatusCode = HttpStatusCode.OK) =
     respondText(json, defaultTextContentType(ContentType("application", "json")), status)
 
-internal suspend inline fun <reified T : DTO> ApplicationCall.receiveDTO(): T? = receive<String>().jsonParseOrNull()
+internal suspend inline fun <reified T : DTO> ApplicationCall.receiveDTO(): T? =
+    receiveChannel().readRemaining().use {
+        val charset = request.contentCharset() ?: Charsets.UTF_8
+        if (charset == Charsets.UTF_8) it.readText()
+        else it.inputStream().reader(charset).readText()
+    }.jsonParseOrNull()
 
 
 fun PipelineContext<Unit, ApplicationCall>.illegalParam(

+ 1 - 1
mirai-api-http/src/main/resources/plugin.yml

@@ -1,5 +1,5 @@
 name: MiraiAPIHTTP
 path: net.mamoe.mirai.api.http.HttpApiPluginBase
-version: v1.7.3
+version: v1.7.4
 info: Mirai HTTP API Server Plugin
 author: "ryoii"