Un'immagine funziona su una connessione diretta veloce, ma è incompleta attraverso un proxy forward più lento. Una possibile causa è che l'origine chiuda la connessione mentre la risposta è ancora in scrittura.

L'I/O di Netty è asincrono. Il ritorno da writeAndFlush non significa che l'operazione sia completata. Questo ordine non è quindi sicuro per una risposta che ha ancora byte in coda:

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

Quando lo scambio HTTP viene chiuso intenzionalmente dopo il suo ultimo messaggio di risposta, collegate la chiusura al future di quella scrittura:

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

Il frammento presuppone che la risposta sia già stata costruita e incorniciata correttamente. Per un corpo in streaming, usate il completamento del suo ultimo messaggio, non la scrittura delle intestazioni. Per una connessione HTTP persistente, non aggiungete una chiusura solo perché una risposta è terminata.

Esaminate l'errore del future come parte della normale gestione degli errori dell'applicazione. Il completamento include errore e annullamento, quindi il solo completamento non è una ricevuta di consegna dal browser.

Il confronto utile è la lunghezza completa della risposta e l'esito della scrittura su ogni percorso. Un proxy può cambiare i tempi abbastanza da rivelare un errore esistente del ciclo di vita; la sua presenza non dimostra che il suo compressore o la sua cache abbiano scartato i byte.

Articoli correlati