Το forward proxy διαβάζει τη γραμμή αιτήματος και τις κεφαλίδες, τις προωθεί και μετά περιμένει σε select ένα σώμα POST. Ο πελάτης το έχει ήδη στείλει. Και οι δύο πλευρές φαίνεται να περιμένουν η μία την άλλη.

Με το BaseHTTPRequestHandler της Python, η ανάγνωση των κεφαλίδων περνά από το rfile, μια προσωρινή ροή εισόδου. Αυτή η ροή μπορεί να διαβάσει μπροστά και να κρατήσει bytes που ανήκουν στο σώμα. Η αναμονή στο υποκείμενο socket ρωτά μόνο αν ο περιγραφέας αρχείου του είναι έτοιμος· δεν ρωτά αν η ροή Python περιέχει ήδη αξιοποιήσιμα δεδομένα.

Ακολουθήστε τον buffer που διάβασε τις κεφαλίδες

Διαβάστε και το σώμα μέσω του self.rfile. Μην περάσετε στο self.connection.recv αφού αναλύσετε τις κεφαλίδες με την προσωρινή ροή. Διαφορετικά ο κώδικας μπορεί να παρακάμψει bytes που κρατά ήδη αυτή η ροή και να περιμένει δεδομένα που δεν θα σταλούν ποτέ ξανά.

Το να περάσετε το ίδιο το rfile στο select δεν κάνει το select να εξετάσει τον buffer του στην Python. Το API ετοιμότητας λειτουργεί μέσω του περιγραφέα αρχείου του αντικειμένου.

Για αίτημα με ένα έγκυρο Content-Length και χωρίς Transfer-Encoding, καταναλώστε ακριβώς τον δηλωμένο αριθμό bytes, χειριζόμενοι το πρόωρο τέλος εισόδου και τα όρια μεγέθους και χρόνου σας. Μη διαβάζετε μέχρι EOF: ένας πελάτης με μόνιμη σύνδεση μπορεί να κρατήσει τη σύνδεση ανοιχτή αφού τελειώσει το αίτημα.

Κάντε το framing ρητό μέρος του proxy

Τα chunked σώματα αιτημάτων χρειάζονται υποστήριξη chunked framing. Δεν μπορούν να διαβαστούν ψάχνοντας για ένα Content-Length που λείπει. Τα διφορούμενα μεταδεδομένα μήκους χρειάζονται καθορισμένη διαδρομή απόρριψης, αντί να επιλέγεται όποια κεφαλίδα φαίνεται βολική.

Ένας blocking handler μπορεί να συνεχίσει να χρησιμοποιεί τη διεπαφή ροής του με φραγμένες αναγνώσεις. Ένα event-driven proxy χρειάζεται μοντέλο buffer που ενσωματώνει την ανάγνωση μπροστά του parser με τη διαχείριση ετοιμότητας. Η αλλαγή ενός timeout δεν θα συμβιβάσει δύο ανεξάρτητους καταναλωτές του ίδιου socket.

Αυτή η διάγνωση αφορά ειδικά το πού κρατούνται τα εισερχόμενα bytes. Μόλις το proxy καταναλώσει το σωστό σώμα, πρέπει ακόμη να το προωθήσει με συνεπές HTTP framing. Ο τυπικός handler http.server είναι χρήσιμο σημείο για να κατανοήσετε τον μηχανισμό, αλλά δεν είναι υλοποίηση forward proxy παραγωγής.

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