Αν το 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: αυτό το παράδειγμα τα προκαλεί αντί να τα προωθεί.

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