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