Una imagen funciona por una conexión directa rápida, pero llega incompleta a través de un proxy de reenvío más lento. Una causa posible es que el origen cierre la conexión mientras su respuesta aún se está escribiendo.

La E/S de Netty es asíncrona. Volver de writeAndFlush no significa que esa operación haya terminado. Por eso este orden no es seguro para una respuesta que todavía tiene bytes en cola:

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

Cuando el intercambio HTTP se cierra intencionadamente después de su último mensaje de respuesta, adjunte el cierre al future de esa escritura:

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

El fragmento supone que la respuesta ya se ha construido y enmarcado correctamente. Para un cuerpo transmitido en flujo, use la finalización de su último mensaje y no la escritura de sus cabeceras. Para una conexión HTTP persistente, no añada un cierre solo porque una respuesta haya terminado.

Examine el fallo del future como parte del manejo normal de errores de la aplicación. La finalización incluye el fallo y la cancelación, así que la finalización por sí sola no es un acuse de entrega del navegador.

La comparación útil es la longitud completa de la respuesta y el resultado de la escritura en cada ruta. Un proxy puede cambiar los tiempos lo suficiente para revelar un error de ciclo de vida existente; su presencia no demuestra que su compresor o su caché hayan descartado los bytes.

Artículos relacionados