Διατήρηση δεδομένων στην προσωρινή μνήμη μετά από απάντηση HTTP CONNECT
Αποφύγετε μια κολλημένη χειραψία HTTP CONNECT εντοπίζοντας το όριο των κεφαλίδων της απάντησης και διατηρώντας τα byte που φτάνουν μετά από αυτό.
Ένα μικρό περίβλημα διαμεσολαβητή μπορεί να δουλέψει για HTTPS και μετά να κολλήσει όταν ξαναχρησιμοποιηθεί για ένα πρωτόκολλο όπου ο διακομιστής μιλά πρώτος. Η ύποπτη γραμμή είναι συχνά εκείνη που περιμένει να τελειώσει ο buffer λήψης με \r\n\r\n.
Το TCP δίνει στον πελάτη μια ροή. Μία κλήση λήψης μπορεί να επιστρέψει μισή γραμμή κατάστασης HTTP, μια πλήρη απάντηση CONNECT ή αυτή την απάντηση αμέσως ακολουθούμενη από δεδομένα της σήραγγας. Δεν υπάρχει καμία υπόσχεση ότι μια ανάγνωση σταματά στο τέλος των κεφαλίδων.
Βρείτε το όριο μέσα στον buffer
Για μια ανταλλαγή HTTP/1.1 CONNECT, συσσωρεύστε byte έως ότου ο τερματιστής κεφαλίδων εμφανιστεί οπουδήποτε στον buffer. Χωρίστε στην πρώτη του εμφάνιση. Αναλύστε τη γραμμή κατάστασης και τις κεφαλίδες από το πρώτο μέρος· κρατήστε ξεχωριστά ό,τι βρίσκεται μετά το όριο. Εφαρμόστε ένα όριο μεγέθους κεφαλίδων και ένα χρονικό όριο κατά την αναμονή, και αντιμετωπίστε μια κενή ανάγνωση υποδοχής ως κλειστή σύνδεση και όχι ως νέα πρόσκληση για βρόχο.
Μια τελική επιτυχημένη απάντηση 2xx θέτει τη σύνδεση σε λειτουργία σήραγγας αμέσως μετά από αυτές τις κεφαλίδες. Τα επόμενα byte της είναι ήδη byte της σήραγγας. Μην τα πετάξετε, μην περιμένετε σώμα απάντησης CONNECT, και μην ερμηνεύσετε ένα πεδίο Content-Length ως άδεια να καταναλώσετε μέρος του νέου πρωτοκόλλου. Οι ενημερωτικές απαντήσεις, αν υπάρχουν, πρέπει να αντιμετωπιστούν πριν από εκείνη την τελική απάντηση.
Το περίβλημα πρέπει να προωθεί τα υπολείμματά του
Η επιστροφή μόνο της υποκείμενης υποδοχής χάνει όσα byte ο αναλυτής της χειραψίας έχει ήδη τραβήξει από αυτήν. Ο επόμενος αναγνώστης χρειάζεται μια ροή με buffer που αποδίδει πρώτα την αποθηκευμένη ουρά και μετά συνεχίζει τις αναγνώσεις υποδοχής. Σε ένα πρωτόκολλο όπου ο διακομιστής μιλά πρώτος, η απώλεια αυτού του αρχικού χαιρετισμού μπορεί να αφήσει και τις δύο πλευρές να περιμένουν επ’ άπειρον.
Αντιθέτως, τα byte από μια αποτυχημένη απάντηση CONNECT δεν είναι χαιρετισμός σήραγγας. Ένα 407 ανήκει ακόμη στην ανταλλαγή με τον διαμεσολαβητή και χρειάζεται χειρισμό ταυτοποίησης· μια άλλη μη επιτυχής κατάσταση χρειάζεται κατάλληλη διαδρομή σφάλματος.
Αυτό έχει ιδιαίτερη σημασία όταν προσαρμόζεται ένας πελάτης FTP ή SSH μέσω διαμεσολαβητή HTTP. Ο διαμεσολαβητής πρέπει επίσης να επιτρέπει τη ζητούμενη θύρα προορισμού, και το FTP μπορεί να χρειάζεται πρόσθετες συνδέσεις δεδομένων. Η σωστή ανάλυση κεφαλίδων λύνει τη μεταβίβαση της ροής· δεν μπορεί να δώσει άδεια CONNECT ούτε να παράσχει το δεύτερο κανάλι του FTP.