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.

Artigos relacionados