Uma imagem funciona numa ligação direta rápida, mas chega incompleta através de um proxy forward mais lento. Uma causa possível é a origem fechar a ligação enquanto a resposta ainda está a ser escrita.

A E/S do Netty é assíncrona. Regressar de writeAndFlush não significa que essa operação tenha terminado. Por isso esta ordem não é segura para uma resposta que ainda tem bytes em fila:

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

Quando a troca HTTP é fechada intencionalmente após a sua última mensagem de resposta, associe o fecho ao future dessa escrita:

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

O fragmento assume que a resposta já foi construída e enquadrada corretamente. Para um corpo transmitido em fluxo, use a conclusão da sua última mensagem e não a escrita dos cabeçalhos. Para uma ligação HTTP persistente, não acrescente um fecho só porque uma resposta terminou.

Examine a falha do future como parte do tratamento normal de erros da aplicação. A conclusão inclui falha e cancelamento, pelo que a conclusão por si só não é um recibo de entrega do navegador.

A comparação útil é o comprimento completo da resposta e o resultado da escrita em cada caminho. Um proxy pode alterar o timing o suficiente para revelar um erro de ciclo de vida existente; a sua presença não prova que o seu compressor ou a sua cache tenham descartado os bytes.

Artigos relacionados