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