Зображення працює через швидке пряме з'єднання, але через повільніший forward-проксі надходить неповним. Одна з можливих причин — джерело закриває з'єднання, поки його відповідь ще записується.

Ввід-вивід Netty асинхронний. Повернення з writeAndFlush не означає, що операція завершена. Тому такий порядок небезпечний для відповіді, у якої ще є байти в черзі:

ctx.writeAndFlush(response);
ctx.close();

Коли HTTP-обмін навмисно закривається після свого останнього повідомлення відповіді, прив'яжіть закриття до future цього запису:

ctx.writeAndFlush(finalResponseMessage)
    .addListener(ChannelFutureListener.CLOSE);

Фрагмент припускає, що відповідь уже правильно побудована й обрамлена. Для потокового тіла використовуйте завершення його останнього повідомлення, а не запис заголовків. Для постійного HTTP-з'єднання не додавайте закриття лише тому, що відповідь завершилася.

Досліджуйте збій future у межах звичайної обробки помилок застосунку. Завершення включає збій і скасування, тому завершення саме по собі не є підтвердженням доставки від браузера.

Корисне порівняння — повна довжина відповіді та результат запису на кожному шляху. Проксі може змінити таймінг достатньо, щоб виявити наявну помилку життєвого циклу; його наявність не доводить, що його компресор або кеш відкинув байти.

Схожі статті