Ktor 3.6.1 исправил зависания HTTP-запросов и обработку условных заголовков

Ktor 3.6.1 исправил зависания HTTP-запросов и обработку условных заголовков
Содержание статьи

Вышел Ktor 3.6.1: официальная таблица релизов датирует патч 30 октября. Обновление Kotlin-фреймворка исправляет несколько случаев зависания HTTP-обмена и ошибки при отмене запросов. Для читателей Mentoring.digital, которые поддерживают серверные приложения и HTTP-клиенты, важен конкретный движок и сценарий, затронутый исправлением.

Отмена и неполностью прочитанный ответ

В движке Java исправлен случай, когда отмена запроса до получения заголовков ответа не прерывала HTTP-обмен. Для Apache5 устранено зависание потокового ответа, если блок обработки завершался до чтения тела. В списке изменений также есть исправление зависания HttpStatement.execute при оставленном непрочитанным теле ответа.

На стороне CIO исправлен сценарий с keep-alive: ошибка при формировании ответа до записи первых байтов могла приводить к зависанию. Это разные пути выполнения. Отсутствие проблемы в обычном успешном запросе ещё не показывает, как приложение поведёт себя при отмене или раннем завершении обработки потока.

Условные запросы и освобождение ресурсов

Для ETag исправлен приоритет условных заголовков: при наличии If-None-Match проверка If-Modified-Since должна игнорироваться. Такое поведение важно проверять отдельно от простого запроса без условий. Совпадение одного ответа не подтверждает корректность всех сочетаний заголовков.

Другие исправления относятся к закрытию WebSocket-соединений в Netty и очистке ресурсов внедрения зависимостей в testApplication. Полезность каждого пункта зависит от компонентов, которые реально использует проект. Сам факт установки патча не подтверждает отсутствие ошибок в прикладном коде.

Что включить в проверку обновления

Редакционная рекомендация: в тестовой среде повторите успешный запрос, отмену до получения заголовков и выход из обработки до чтения всего тела. Для серверного кеширования добавьте запросы с каждым условным заголовком по отдельности и с обоими сразу. Сверяйте завершение операций и освобождение ресурсов, а не только код ответа.

Сохраните прежнюю версию зависимостей и условия воспроизведения. Не меняйте одновременно движок клиента и логику обработки ошибок: так легче связать результат с обновлением. Разобрать жизненный цикл запроса и корутины можно с наставником по Kotlin.

Похожие статьи по данной теме