denis-hrebeniuk
@denis-hrebeniuk
Мобайл/бэкенд разработчик

Почему Ktor не загружает архив через метод HttpClient().get?

Столкнулся с непонятным поведением Ktor. Пытаюсь загрузить файл, получить процент загрузки и записать файл, но процесс загрузки зафризился в этой функции val httpResponse = client.get(fileUrl). В итоге приложение крашит из-за истечения тайм-аута, который 60 секунд.

val fileUrl = "https://speed.hetzner.de/100MB.bin"
val fileName = "file"

val client = HttpClient {
	install(HttpTimeout) {
		connectTimeoutMillis = 60000 // пробовал ждать 60 секунд
	}
}
val file = File(getExternalFilesDir(null), fileName)

lifecycleScope.launch(Dispatchers.IO) {
	val httpResponse = client.get(fileUrl) // здесь фриз и дальше код не работает
	println(httpResponse.headers.toString())
	val channel: ByteReadChannel = httpResponse.body()

	val byteArray = ByteArray(httpResponse.contentLength()!!.toInt())
	var offset = 0

	do {
		val currentRead = channel.readAvailable(byteArray, offset, byteArray.size)
		offset += currentRead
		val progress = (offset * 100f / byteArray.size).roundToInt()
		println("progress: $progress")
	} while (currentRead > 0)

	client.close()

	if (httpResponse.status.isSuccess()) {
		file.writeBytes(byteArray)
		println("A file saved to ${file.path}")
	} else {
		println("error")
	}
}


Логи Ktor
022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: 20:55:40.795 [DefaultDispatcher-worker-3] INFO io.ktor.client.HttpClient - REQUEST: https://speed.hetzner.de/100MB.bin
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: METHOD: HttpMethod(value=GET)
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: COMMON HEADERS
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Accept: */*
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Accept-Charset: UTF-8
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: CONTENT HEADERS
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: -> Content-Length: 0
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY Content-Type: null
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY START
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: 
2022-08-16 23:55:40.802 30343-30389/com.example.myapplication I/System.out: BODY END


P.S Если вместо ссылки на файл поставлю ссылку на .json = все работает
  • Вопрос задан
  • 53 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы