Οι χειριστές CONNECT του Node.js πρέπει να διατηρούν το buffer head
Χειριστείτε το socket CONNECT και το buffer head του Node στο όριο HTTP προς σήραγγα, διατηρώντας τα byte που έχουν ήδη διαβαστεί πέρα από τις κεφαλίδες.
Ένας διακομιστής HTTP του Node χειρίζεται ένα συνηθισμένο αίτημα διαμεσολαβητή μέσω του callback αιτήματος. Το CONNECT ακολουθεί άλλη διαδρομή: ο διακομιστής εκπέμπει connect μαζί με το αίτημα, το socket του πελάτη και ένα buffer head.
Αυτό το γεγονός είναι η παράδοση μεταξύ ανάλυσης HTTP και σήραγγας. Δεν υπάρχει συνηθισμένο αντικείμενο ServerResponse για να συνεχίσει να χρησιμοποιείται για την κίνηση της σήραγγας.
| Όρισμα | Τι μεταφέρει |
|---|---|
req | Το αίτημα CONNECT, συμπεριλαμβανομένης της αρχής προορισμού και των κεφαλίδων του |
clientSocket | Η σύνδεση πίσω προς τον πελάτη |
head | Δεδομένα σήραγγας που ο Node έχει ήδη διαβάσει πέρα από τις κεφαλίδες HTTP, ενδεχομένως κενά |
Ολοκληρώστε την απόφαση HTTP πριν προωθήσετε byte
Επικυρώστε τον ζητούμενο κεντρικό υπολογιστή και θύρα, εφαρμόστε την πολιτική πρόσβασης και ταυτοποίησης του διαμεσολαβητή και δημιουργήστε τη σύνδεση ανάντη. Το CONNECT προσδιορίζει μια αρχή όπως service.example:443· αναλύστε αυτή τη μορφή με γνώμονα τις αρχές IPv6 αντί να διαιρείτε στα τυφλά σε κάθε άνω κάτω τελεία.
Όταν η σήραγγα γίνει αποδεκτή, στείλτε την επιτυχή απόκριση HTTP ακολουθούμενη από τη γραμμή κενού που την τερματίζει. Στη συνέχεια προωθήστε τυχόν byte head ανάντη πριν συνεχίσετε με τα επόμενα byte από το socket του πελάτη. Η επισύναψη νέου ακροατή δεδομένων δεν μπορεί να ανακτήσει ένα buffer που έχει ήδη παραδοθεί χωριστά στον χειριστή.
Το επίσημο παράδειγμα σήραγγας του Node εκτελεί αυτή την παράδοση με serverSocket.write(head) πριν συνδέσει τις δύο κατευθύνσεις ροής. Το μικρό του παράδειγμα δείχνει τη μετάβαση· ένας διαμεσολαβητής σε παραγωγή χρειάζεται επίσης περιορισμένες προσπάθειες σύνδεσης, ελέγχους πρόσβασης και διαχείριση κύκλου ζωής.
Μετά την επιτυχία, τα byte ανήκουν στο πρωτόκολλο της υπηρεσίας
Μια επιτυχής απόκριση CONNECT μετατρέπει τη σύνδεση σε ροή byte. Αν ο στόχος είναι ιστότοπος HTTPS, η ανταλλαγή TLS του ταξιδεύει μέσα σε αυτή τη ροή. Η απλή σήραγγα δεν απαιτεί από τον διαμεσολαβητή να εκδώσει πιστοποιητικό ιστότοπου αντικατάστασης.
Πριν από την αποδοχή του CONNECT, ένα σφάλμα HTTP μπορεί να εξηγήσει γιατί απορρίφθηκε. Μετά την αποδοχή, η εγγραφή ενός HTTP 500 στη ροή θα ένιωθε byte στο πρωτόκολλο της σήραγγας. Αντ' αυτού, τερματίστε ή καταστρέψτε τις κατάλληλες συνδέσεις σε μεταγενέστερες αποτυχίες.
Συνδέστε και τις δύο κατευθύνσεις με διαχείριση ροής με επίγνωση της αντίθλιψης, και αποφασίστε πώς τα γεγονότα end, error και close τερματίζουν τον ομότιμο. Διατηρήστε το αρχικό buffer head ως μέρος του ίδιου μοντέλου ιδιοκτησίας· είναι δεδομένα εφαρμογής, όχι περισσευούμενες κεφαλίδες HTTP προς απόρριψη.