pull/977/head
gedoor 4 years ago
parent b86339364d
commit da0d070bfe
  1. 22
      app/src/main/java/io/legado/app/help/http/OkHttpExtensions.kt
  2. 27
      app/src/main/java/io/legado/app/help/http/parser/StrResponseParser.kt
  3. 20
      app/src/main/java/io/legado/app/help/http/parser/TextParser.kt

@ -1,10 +1,14 @@
package io.legado.app.help.http package io.legado.app.help.http
import io.legado.app.utils.EncodingDetect
import io.legado.app.utils.UTF8BOMFighter
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import okhttp3.Call import okhttp3.Call
import okhttp3.Callback import okhttp3.Callback
import okhttp3.Response import okhttp3.Response
import okhttp3.ResponseBody
import java.io.IOException import java.io.IOException
import java.nio.charset.Charset
import kotlin.coroutines.resume import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException import kotlin.coroutines.resumeWithException
@ -25,3 +29,21 @@ suspend fun Call.await(): Response = suspendCancellableCoroutine { block ->
}) })
} }
fun ResponseBody.text(encode: String? = null): String {
val responseBytes = UTF8BOMFighter.removeUTF8BOM(bytes())
var charsetName: String? = encode
charsetName?.let {
return String(responseBytes, Charset.forName(charsetName))
}
//根据http头判断
contentType()?.charset()?.let {
return String(responseBytes, it)
}
//根据内容判断
charsetName = EncodingDetect.getHtmlEncode(responseBytes)
return String(responseBytes, Charset.forName(charsetName))
}

@ -1,40 +1,19 @@
package io.legado.app.help.http.parser package io.legado.app.help.http.parser
import io.legado.app.help.http.StrResponse import io.legado.app.help.http.StrResponse
import io.legado.app.utils.EncodingDetect import io.legado.app.help.http.text
import io.legado.app.utils.UTF8BOMFighter
import okhttp3.Response import okhttp3.Response
import rxhttp.wrapper.annotation.Parser import rxhttp.wrapper.annotation.Parser
import rxhttp.wrapper.exception.HttpStatusCodeException import rxhttp.wrapper.exception.HttpStatusCodeException
import java.nio.charset.Charset
@Parser(name = "StrResponse") @Parser(name = "StrResponse")
class StrResponseParser(private val encode: String? = null) : class StrResponseParser(private val encode: String? = null) :
rxhttp.wrapper.parse.Parser<StrResponse> { rxhttp.wrapper.parse.Parser<StrResponse> {
override fun onParse(response: Response): StrResponse { override fun onParse(response: Response): StrResponse {
val body = getString(response) val body = response.body?.text(encode)
?: throw HttpStatusCodeException(response, "内容为空")
return StrResponse(response, body) return StrResponse(response, body)
} }
private fun getString(response: Response): String {
val responseBody = response.body ?: throw HttpStatusCodeException(response, "内容为空")
val responseBytes = UTF8BOMFighter.removeUTF8BOM(responseBody.bytes())
var charsetName: String? = encode
charsetName?.let {
return String(responseBytes, Charset.forName(charsetName))
}
//根据http头判断
responseBody.contentType()?.charset()?.let {
return String(responseBytes, it)
}
//根据内容判断
charsetName = EncodingDetect.getHtmlEncode(responseBytes)
return String(responseBytes, Charset.forName(charsetName))
}
} }

@ -1,11 +1,9 @@
package io.legado.app.help.http.parser package io.legado.app.help.http.parser
import io.legado.app.utils.EncodingDetect import io.legado.app.help.http.text
import io.legado.app.utils.UTF8BOMFighter
import okhttp3.Response import okhttp3.Response
import rxhttp.wrapper.annotation.Parser import rxhttp.wrapper.annotation.Parser
import rxhttp.wrapper.exception.HttpStatusCodeException import rxhttp.wrapper.exception.HttpStatusCodeException
import java.nio.charset.Charset
@Parser(name = "Text") @Parser(name = "Text")
class TextParser(private val encode: String? = null) : rxhttp.wrapper.parse.Parser<String> { class TextParser(private val encode: String? = null) : rxhttp.wrapper.parse.Parser<String> {
@ -13,21 +11,7 @@ class TextParser(private val encode: String? = null) : rxhttp.wrapper.parse.Pars
override fun onParse(response: Response): String { override fun onParse(response: Response): String {
val responseBody = response.body ?: throw HttpStatusCodeException(response, "内容为空") val responseBody = response.body ?: throw HttpStatusCodeException(response, "内容为空")
val responseBytes = UTF8BOMFighter.removeUTF8BOM(responseBody.bytes()) return responseBody.text(encode)
var charsetName: String? = encode
charsetName?.let {
return String(responseBytes, Charset.forName(charsetName))
}
//根据http头判断
responseBody.contentType()?.charset()?.let {
return String(responseBytes, it)
}
//根据内容判断
charsetName = EncodingDetect.getHtmlEncode(responseBytes)
return String(responseBytes, Charset.forName(charsetName))
} }
} }
Loading…
Cancel
Save