Obrázek funguje přes rychlé přímé připojení, ale přes pomalejší forward proxy je neúplný. Jednou z možných příčin je, že původ zavře spojení, zatímco se jeho odpověď ještě zapisuje.

I/O v Netty je asynchronní. Návrat z writeAndFlush neznamená, že operace skončila. Toto pořadí je proto nebezpečné u odpovědi, která má ještě bajty ve frontě:

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

Když se HTTP výměna záměrně zavírá po své poslední zprávě odpovědi, připojte zavření k future tohoto zápisu:

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

Úryvek předpokládá, že odpověď už je správně sestavená a zarámovaná. U streamovaného těla použijte dokončení jeho poslední zprávy, ne zápis hlaviček. U trvalého HTTP spojení nepřidávejte zavření jen proto, že odpověď skončila.

Selhání future prozkoumejte v rámci běžného zpracování chyb aplikace. Dokončení zahrnuje selhání i zrušení, takže samotné dokončení není potvrzením doručení z prohlížeče.

Užitečné srovnání je úplná délka odpovědi a výsledek zápisu na každé cestě. Proxy může změnit časování natolik, že odhalí existující chybu životního cyklu; její přítomnost však nedokazuje, že jeho kompresor nebo cache bajty zahodily.

Související články