Неповні зображення через проксі: перевірте завершення запису в Netty
Коли зображення надходять через проксі неповними, перевірте, чи не закриває джерело свій канал Netty до завершення асинхронного запису відповіді.
Зображення працює через швидке пряме з'єднання, але через повільніший forward-проксі надходить неповним. Одна з можливих причин — джерело закриває з'єднання, поки його відповідь ще записується.
Ввід-вивід Netty асинхронний. Повернення з writeAndFlush не означає, що операція завершена. Тому такий порядок небезпечний для відповіді, у якої ще є байти в черзі:
ctx.writeAndFlush(response);
ctx.close();
Коли HTTP-обмін навмисно закривається після свого останнього повідомлення відповіді, прив'яжіть закриття до future цього запису:
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
Фрагмент припускає, що відповідь уже правильно побудована й обрамлена. Для потокового тіла використовуйте завершення його останнього повідомлення, а не запис заголовків. Для постійного HTTP-з'єднання не додавайте закриття лише тому, що відповідь завершилася.
Досліджуйте збій future у межах звичайної обробки помилок застосунку. Завершення включає збій і скасування, тому завершення саме по собі не є підтвердженням доставки від браузера.
Корисне порівняння — повна довжина відповіді та результат запису на кожному шляху. Проксі може змінити таймінг достатньо, щоб виявити наявну помилку життєвого циклу; його наявність не доводить, що його компресор або кеш відкинув байти.