Imagini incomplete prin proxy: verificați finalizarea scrierii Netty
Când imaginile sosesc incomplete prin proxy, verificați dacă originea își închide canalul Netty înainte ca scrierea asincronă a răspunsului să se fi încheiat.
O imagine funcționează pe o conexiune directă rapidă, dar este incompletă prin intermediul unui proxy forward mai lent. O posibilă cauză este că originea închide conexiunea în timp ce răspunsul său este încă scris.
I/O-ul Netty este asincron. Întoarcerea din writeAndFlush nu înseamnă că operațiunea s-a încheiat. Prin urmare, această ordine nu este sigură pentru un răspuns care mai are octeți în coadă:
ctx.writeAndFlush(response);
ctx.close();
Când schimbul HTTP se închide intenționat după ultimul său mesaj de răspuns, atașați închiderea la future-ul acelei scrieri:
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
Fragmentul presupune că răspunsul a fost deja construit și încadrat corect. Pentru un corp transmis în flux, folosiți finalizarea ultimului său mesaj, nu scrierea antetelor. Pentru o conexiune HTTP persistentă, nu adăugați o închidere doar pentru că un răspuns s-a terminat.
Examinați eșecul future-ului ca parte a tratării normale a erorilor aplicației. Finalizarea include eșecul și anularea, deci finalizarea singură nu este o confirmare de livrare din partea browserului.
Comparația utilă este lungimea completă a răspunsului și rezultatul scrierii pe fiecare cale. Un proxy poate modifica suficient sincronizarea încât să dezvăluie o eroare existentă de ciclu de viață; prezența sa nu dovedește că compresorul sau cache-ul său a eliminat octeții.