Een afbeelding werkt via een snelle directe verbinding, maar is onvolledig via een langzamere forward-proxy. Een mogelijke oorzaak is dat de oorsprong de verbinding sluit terwijl de respons nog wordt geschreven.

Netty I/O is asynchroon. Terugkeren uit writeAndFlush betekent niet dat die bewerking is voltooid. Deze volgorde is daarom onveilig voor een respons die nog bytes in de wachtrij heeft:

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

Wanneer de HTTP-uitwisseling opzettelijk wordt gesloten na het laatste responsbericht, koppelt u het sluiten aan de future van die schrijfactie:

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

Het fragment gaat ervan uit dat de respons al correct is opgebouwd en geframed. Gebruik voor een gestreamde body de voltooiing van het laatste bericht, niet het schrijven van de headers. Voeg voor een persistente HTTP-verbinding geen sluiting toe alleen omdat een respons klaar is.

Onderzoek het falen van de future als onderdeel van de normale foutafhandeling van de applicatie. Voltooiing omvat falen en annulering, dus voltooiing alleen is geen leveringsbewijs van de browser.

De nuttige vergelijking is de volledige responslengte en het schrijfresultaat op elk pad. Een proxy kan de timing genoeg veranderen om een bestaande lifecycle-fout bloot te leggen; de aanwezigheid ervan bewijst niet dat zijn compressor of cache de bytes heeft weggegooid.

Gerelateerde artikelen