ios Ktor达尔文引擎不支持分块数据阅读

pftdvrlh  于 12个月前  发布在  iOS
关注(0)|答案(1)|浏览(109)

我在iOS中遇到了分块传输编码的问题。这是KMM代码:

private const val DEFAULT_BUFFER_SIZE: Int = 8 * 1024

internal val client = HttpClient()
    
fun readChunkedData(url: String, onChunk: (String) -> Unit): Job {
    val scope = MainScope()
    return scope.launch {
        client.preparePost(url).execute {
            val channel: ByteReadChannel = it.body()
            while (!channel.isClosedForRead) {
                val buffer = ByteArray(DEFAULT_BUFFER_SIZE)
                val count = channel.readAvailable(buffer)
                if (count > 0) {
                   val trimmed = buffer
                      .take(count)
                      .map { c -> Char(c.toInt()) }
                      .toCharArray()

                    onChunk(trimmed.concatToString())
                }
            }
        }
    }
}

iOS使用达尔文引擎和Android Okhttp for Ktor
在Android中,这段代码运行良好:

但在iOS中并没有像预期的那样工作(而不是阅读块正在等待整个响应):

有什么解决办法吗?我试图使用CIO引擎,但在iOS中遇到另一个问题:TLS sessions are not supported on Native platform.

xfyts7mz

xfyts7mz1#

我已经找到了问题所在。出于某种原因,iOS在接收到“纯文本”内容类型时,不会将后端响应视为分块。
然而,一旦后端响应头被更改为:

Content-Type: application/octet-stream

它开始正常工作:

相关问题