אם Requests כבר פירק דחיסה של גוף, העברתו עם Content-Encoding: gzip מבקשת מהלקוח הבא לפרק את הדחיסה שוב. החליטו איזו הצגת מטען הפרוקסי שולח לפני העתקת הכותרות שלו.

מטען שנשלחכותרות content
בייטים מקודדים מקורייםשמרו על הקידוד החל ועל אורך המטען המדויק
בייטים מפוענחיםהסירו את הקידוד המפוענח; הסירו או חשבו מחדש את האורך המתאים

עבור בייטי מטען מקודדים, הקטע הזה קורא את הזרם הגולמי של 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 הוא פלט התגובה הקיים. הסטטוס והכותרות שלו חייבים כבר לעקוב אחרי המדיניות שנבחרה; הקטע הזה אינו מיישם שרת פרוקסי מלא.

מסגור ההעברה נפרד מקידוד content של gzip. ספריית ה-HTTP במעלה הזרם כבר טיפלה במסגור, כולל הסרת מקטעים, לכן אל תעתיקו את Transfer-Encoding בעיניים עצומות. שרת המורד ממסגר את התגובה שלו גם כשהמטען נשאר מקודד ב-gzip.

response.text ואחריו קידוד UTF-8 גם משנה את ההצגה ואינו יכול לשמר נתונים בינאריים שרירותיים. סגרו או צרכו את תגובת המעלה בכל מסלול, וטפלו בשגיאות HTTP לפי חוזה הפרוקסי: הדוגמה הזו זורקת אותן במקום להעביר אותן.

מאמרים קשורים