Προωθήστε bytes gzip με τις κεφαλίδες που τα περιγράφουν
Επιλέξτε κωδικοποιημένα ή αποκωδικοποιημένα φορτία σε proxy βασισμένο σε Requests και δώστε στην κατάντη απόκριση αντίστοιχες κεφαλίδες content και τη δική της δομή.
Αν το Requests έχει ήδη αποσυμπιέσει ένα σώμα, η προώθησή του με Content-Encoding: gzip ζητά από τον επόμενο πελάτη να το αποσυμπιέσει ξανά. Αποφασίστε ποια αναπαράσταση φορτίου στέλνει το proxy πριν αντιγράψετε τις κεφαλίδες του.
| Φορτίο που στάλθηκε | Κεφαλίδες content |
|---|---|
| Αρχικά κωδικοποιημένα bytes | Διατηρήστε την εφαρμοστέα κωδικοποίηση και το ακριβές μήκος φορτίου |
| Αποκωδικοποιημένα bytes | Αφαιρέστε την αποκωδικοποιημένη κωδικοποίηση· αφαιρέστε ή υπολογίστε ξανά το αντίστοιχο μήκος |
Για κωδικοποιημένα bytes φορτίου, αυτό το απόσπασμα διαβάζει την ακατέργαστη ροή του urllib3 χωρίς αποκωδικοποίηση content:
with requests.get(url, stream=True, timeout=(5, 30)) as upstream:
upstream.raise_for_status()
for block in upstream.raw.stream(65536, decode_content=False):
downstream.write(block)downstream είναι η υπάρχουσα έξοδος απόκρισης. Η κατάσταση και οι κεφαλίδες του πρέπει ήδη να ακολουθούν την επιλεγμένη πολιτική· αυτό το απόσπασμα δεν υλοποιεί πλήρη διακομιστή proxy.
Η δομή μεταφοράς είναι ξεχωριστή από την κωδικοποίηση content gzip. Η βιβλιοθήκη HTTP ανάντη έχει ήδη χειριστεί τη δομή, συμπεριλαμβανομένης της αφαίρεσης τμημάτων, οπότε μην αντιγράφετε τυφλά το Transfer-Encoding. Ο κατάντη διακομιστής δομεί τη δική του απόκριση ακόμη και όταν το φορτίο παραμένει κωδικοποιημένο με gzip.
Το response.text ακολουθούμενο από κωδικοποίηση UTF-8 αλλάζει επίσης την αναπαράσταση και δεν μπορεί να διατηρήσει αυθαίρετα δυαδικά δεδομένα. Κλείστε ή καταναλώστε την ανάντη απόκριση σε κάθε διαδρομή και χειριστείτε τα σφάλματα HTTP σύμφωνα με το συμβόλαιο του proxy: αυτό το παράδειγμα τα προκαλεί αντί να τα προωθεί.