Ein Bild funktioniert über eine schnelle direkte Verbindung, ist aber über einen langsameren Forward-Proxy unvollständig. Eine mögliche Ursache ist, dass der Ursprung die Verbindung schließt, während seine Antwort noch geschrieben wird.

Netty-I/O ist asynchron. Die Rückkehr aus writeAndFlush bedeutet nicht, dass dieser Vorgang abgeschlossen ist. Diese Reihenfolge ist daher für eine Antwort unsicher, die noch gepufferte Bytes hat:

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

Wenn der HTTP-Austausch nach seiner letzten Antwortnachricht absichtlich geschlossen wird, hängen Sie das Schließen an die Future dieses Schreibvorgangs an:

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

Das Fragment geht davon aus, dass die Antwort bereits korrekt aufgebaut und geframt wurde. Bei einem gestreamten Body ist der Abschluss der letzten Nachricht zu verwenden, nicht das Schreiben der Header. Bei einer persistenten HTTP-Verbindung darf nicht allein deshalb geschlossen werden, weil eine Antwort beendet ist.

Untersuchen Sie das Scheitern des Future im Rahmen der normalen Fehlerbehandlung der Anwendung. Abschluss umfasst Fehler und Abbruch; der Abschluss allein ist also kein Zustellnachweis des Browsers.

Der nützliche Vergleich ist die vollständige Antwortlänge und das Schreibergebnis auf jedem Pfad. Ein Proxy kann das Timing so ändern, dass ein bestehender Lebenszyklusfehler sichtbar wird; sein Vorhandensein belegt nicht, dass sein Kompressor oder Cache die Bytes verworfen hat.

Ähnliche Artikel