Изображение работает через быстрое прямое соединение, но через более медленный forward-прокси приходит неполным. Одна из возможных причин — источник закрывает соединение, пока его ответ ещё записывается.

Ввод-вывод Netty асинхронен. Возврат из writeAndFlush не означает, что операция завершена. Поэтому такой порядок небезопасен для ответа, у которого ещё есть байты в очереди:

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

Когда HTTP-обмен намеренно закрывается после своего последнего сообщения ответа, привяжите закрытие к future этой записи:

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

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

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

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

Похожие статьи