Obraz działa przez szybkie bezpośrednie połączenie, ale przez wolniejsze proxy forward jest niekompletny. Jedną z możliwych przyczyn jest to, że źródło zamyka połączenie, gdy jego odpowiedź jest jeszcze zapisywana.

Wejście/wyjście Netty jest asynchroniczne. Powrót z writeAndFlush nie oznacza, że operacja została zakończona. Dlatego ta kolejność jest niebezpieczna dla odpowiedzi, która ma jeszcze bajty w kolejce:

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

Gdy wymiana HTTP jest celowo zamykana po ostatniej wiadomości odpowiedzi, dołącz zamknięcie do future tego zapisu:

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

Fragment zakłada, że odpowiedź została już poprawnie zbudowana i oprawiona. W przypadku przesyłanego strumieniowo ciała użyj zakończenia ostatniej wiadomości, a nie zapisu nagłówków. W przypadku trwałego połączenia HTTP nie dodawaj zamknięcia tylko dlatego, że odpowiedź się skończyła.

Zbadaj niepowodzenie future w ramach normalnej obsługi błędów aplikacji. Zakończenie obejmuje niepowodzenie i anulowanie, więc samo zakończenie nie jest potwierdzeniem dostarczenia od przeglądarki.

Użytecznym porównaniem jest pełna długość odpowiedzi i wynik zapisu na każdej ścieżce. Proxy może zmienić synchronizację na tyle, by ujawnić istniejący błąd cyklu życia; jego obecność nie dowodzi, że jego kompresor lub pamięć podręczna odrzuciły bajty.

Powiązane artykuły