Выява працуе праз хуткае прамое злучэнне, але праз павольнейшы прамы проксі прыходзіць няпоўнай. Адна з магчымых прычын — крыніца закрывае злучэнне, пакуль яе адказ яшчэ запісваецца.

Увод/вывад Netty асінхронны. Вяртанне з writeAndFlush не азначае, што гэтая аперацыя завершана. Таму такі парадак небяспечны для адказу, у якога яшчэ ёсць байты ў чарзе:

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

Калі HTTP-абмен наўмысна закрываецца пасля свайго апошняга паведамлення адказу, далучыце закрыццё да future гэтага запісу:

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

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

Правярайце збой future у рамках звычайнай апрацоўкі памылак праграмы. Завяршэнне ўключае збой і скасаванне, таму завяршэнне само па сабе не з'яўляецца пацвярджэннем дастаўкі ад браўзера.

Карыснае параўнанне — поўная даўжыня адказу і вынік запісу на кожным шляху. Проксі можа змяніць час настолькі, каб выявіць існуючую памылку жыццёвага цыклу; яго наяўнасць не даказвае, што яго кампрэсар або кэш адкінуў байты.

Падобныя артыкулы