Imaxes incompletas a través dun proxy: comprobe a finalización de escritura de Netty
Cando as imaxes chegan incompletas a través dun proxy, examine se a orixe pecha o seu canal Netty antes de que remate a escritura asíncrona da resposta.
Unha imaxe funciona por unha conexión directa rápida, pero chega incompleta a través dun proxy de reenvío máis lento. Unha causa posible é que a orixe peche a conexión mentres a súa resposta aínda se está escribindo.
A E/S de Netty é asíncrona. Volver de writeAndFlush non significa que esa operación rematase. Por iso esta orde non é segura para unha resposta que aínda ten bytes na cola:
ctx.writeAndFlush(response);
ctx.close();
Cando o intercambio HTTP se pecha intencionadamente despois da súa última mensaxe de resposta, anexe o peche ao future desa escritura:
ctx.writeAndFlush(finalResponseMessage)
.addListener(ChannelFutureListener.CLOSE);
O fragmento supón que a resposta xa se construíu e encadrou correctamente. Para un corpo transmitido en fluxo, use a finalización da súa última mensaxe e non a escritura das súas cabeceiras. Para unha conexión HTTP persistente, non engada un peche só porque unha resposta rematou.
Examine o fallo do future como parte do manexo normal de erros da aplicación. A finalización inclúe o fallo e a cancelación, así que a finalización por si soa non é un acuse de entrega do navegador.
A comparación útil é a lonxitude completa da resposta e o resultado da escritura en cada ruta. Un proxy pode cambiar os tempos o suficiente para revelar un erro de ciclo de vida existente; a súa presenza non demostra que o seu compresor ou a súa caché descartasen os bytes.