in ktor-io/jvm/src/io/ktor/utils/io/ByteBufferChannel.kt [660:696]
override suspend fun readPacket(size: Int, headerSizeHint: Int): ByteReadPacket {
closed?.cause?.let { rethrowClosed(it) }
if (size == 0) return ByteReadPacket.Empty
val builder = BytePacketBuilder(headerSizeHint)
val buffer = BufferPool.borrow()
var remaining = size
try {
while (remaining > 0) {
buffer.clear()
if (buffer.remaining() > remaining) {
buffer.limit(remaining)
}
val rc = readAsMuchAsPossible(buffer)
if (rc == 0) break
buffer.flip()
builder.writeFully(buffer)
remaining -= rc
}
} catch (t: Throwable) {
BufferPool.recycle(buffer)
builder.release()
throw t
}
return if (remaining == 0) {
BufferPool.recycle(buffer)
builder.build()
} else {
return readPacketSuspend(remaining, builder, buffer)
}
}