Ο πελάτης βλέπει 200 Connection Established, ξεκινά το TLS και αμέσως αναφέρει ανοησίες εκεί που θα έπρεπε να υπάρχει εγγραφή TLS. Ψάξτε για ημιτελή απόκριση HTTP πριν κατηγορήσετε τις ρυθμίσεις κρυπτογράφησης του προορισμού.

Σε μια ανταλλαγή HTTP/1 CONNECT, η γραμμή κατάστασης είναι μόνο η αρχή της απόκρισης. Μπορούν να ακολουθήσουν πεδία κεφαλίδας. Η κενή γραμμή που τερματίζει το τμήμα κεφαλίδας σηματοδοτεί τη μετάβαση στη σήραγγα μετά από επιτυχή απόκριση CONNECT.

HTTP/1.1 200 Connection Established\r\n
Proxy-Agent: example\r\n
\r\n

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

Κάντε την παράδοση ρητή κατάσταση του parser

  1. Συλλέξτε και αναλύστε τη γραμμή κατάστασης. Χρησιμοποιήστε τον αριθμητικό κωδικό αντί για ακριβή αγγλική φράση αιτίας.
  2. Συνεχίστε μέχρι να φτάσει ο πλήρης τερματιστής του τμήματος κεφαλίδας. Μια επιτυχής γραμμή κατάστασης δεν εξαφανίζει τα υπόλοιπα πεδία.
  3. Σε επιτυχή απόκριση CONNECT, θεωρήστε το byte αμέσως μετά τον τερματιστή ως αρχή των δεδομένων σήραγγας. Στις άλλες αποκρίσεις ακολουθήστε την κατάλληλη διαχείριση απόκρισης HTTP και πιστοποίησης.
  4. Μεταφέρετε τη σύνδεση και τυχόν ακατανάλωτα byte μέσω της υποστηριζόμενης από το επόμενο πρωτόκολλο διεπαφής I/O με buffer.

Το τελευταίο βήμα μετράει ακόμη και με καλή αναζήτηση διαχωριστικού. Ένας reader με buffer μπορεί να έχει καταναλώσει περισσότερα από το socket απ' όσα ζήτησε ο parser. Η εκκίνηση TLS στο γυμνό socket ενώ εγκαταλείπετε αυτόν τον reader μπορεί να αφήσει byte στο private buffer του reader.

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

Σκεφτείτε αρκετά όρια

Φανταστείτε μια ανάγνωση που τελειώνει μετά το Proxy-Agent:. Ο parser χρειάζεται ακόμη byte κεφαλίδας HTTP. Φανταστείτε μια άλλη που τελειώνει στη μέση της τελικής ακολουθίας CRLF. Αυτό δεν είναι ακόμη πλήρες τμήμα κεφαλίδας. Τώρα φανταστείτε ένα πλήρες επιτυχές τμήμα κεφαλίδας ακολουθούμενο από byte σήραγγας στο ίδιο buffer: αυτά τα επιπλέον byte πρέπει να επιβιώσουν της παράδοσης.

Το 407 είναι διαφορετική έκβαση. Απαιτεί διαχείριση πιστοποίησης· δεν επιτρέπει TLS ClientHello σε σήραγγα που δεν άνοιξε ποτέ.

Προτιμήστε έναν συντηρούμενο connector, εκτός αν η υλοποίηση της χειραψίας είναι η εργασία. Αυτό το όριο αφορά ειδικά την ανταλλαγή HTTP/1 που φαίνεται εδώ. Ένα proxy HTTP/2 μεταφέρει το CONNECT σε ροή με διαφορετική κατάτμηση.

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