Μια εικόνα λειτουργεί μέσω γρήγορης άμεσης σύνδεσης, αλλά είναι ελλιπής μέσω ενός πιο αργού forward proxy. Μια πιθανή αιτία είναι η προέλευση να κλείνει τη σύνδεση ενώ η απόκρισή της γράφεται ακόμη.

Το I/O του Netty είναι ασύγχρονο. Η επιστροφή από το writeAndFlush δεν σημαίνει ότι η λειτουργία ολοκληρώθηκε. Επομένως αυτή η σειρά δεν είναι ασφαλής για απόκριση που έχει ακόμη bytes στην ουρά:

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

Όταν η ανταλλαγή HTTP κλείνει σκόπιμα μετά το τελευταίο μήνυμα απόκρισης, συνδέστε το κλείσιμο με το future αυτής της εγγραφής:

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

Το απόσπασμα υποθέτει ότι η απόκριση έχει ήδη κατασκευαστεί και πλαισιωθεί σωστά. Για ροϊκό σώμα, χρησιμοποιήστε την ολοκλήρωση του τελευταίου μηνύματος και όχι την εγγραφή των κεφαλίδων. Για μόνιμη σύνδεση HTTP, μην προσθέτετε κλείσιμο μόνο επειδή τελείωσε μια απόκριση.

Εξετάστε την αποτυχία του future ως μέρος της κανονικής διαχείρισης σφαλμάτων της εφαρμογής. Η ολοκλήρωση περιλαμβάνει αποτυχία και ακύρωση, άρα η ολοκλήρωση μόνη της δεν είναι απόδειξη παράδοσης από το πρόγραμμα περιήγησης.

Η χρήσιμη σύγκριση είναι το πλήρες μήκος απόκρισης και το αποτέλεσμα εγγραφής σε κάθε διαδρομή. Ένας proxy μπορεί να αλλάξει τον χρονισμό αρκετά ώστε να αποκαλύψει ένα υπάρχον σφάλμα κύκλου ζωής· η παρουσία του δεν αποδεικνύει ότι ο συμπιεστής ή η προσωρινή μνήμη του πέταξαν τα bytes.

Σχετικά άρθρα