Niekompletne obrazy przez proxy: sprawdź zakończenie zapisu w Netty
Gdy obrazy przez proxy przychodzą niekompletne, sprawdź, czy źródło nie zamyka kanału Netty, zanim zakończy się asynchroniczny zapis odpowiedzi.
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.