تمرير بايتات gzip مع الرؤوس التي تصفها
اختر حِزمًا مُرمّزة أو مفكوكة الترميز في وكيل قائم على Requests، ثم امنح الاستجابة النهائية رؤوس محتوى مطابقة وإطارها الخاص.
إذا كان Requests قد فك ضغط جسم ما بالفعل، فإن تمريره مع Content-Encoding: gzip يطلب من العميل التالي فك ضغطه مرة أخرى. حدّد أي تمثيل للحِملة يرسله الوكيل قبل نسخ رؤوسه.
| الحِملة المرسلة | رؤوس المحتوى |
|---|---|
| البايتات المُرمّزة الأصلية | أبقِ الترميز المنطبق وطول الحِملة الدقيق |
| البايتات المفكوكة | أزل الترميز المفكوك؛ وأزل الطول المقابل أو أعد حسابه |
بالنسبة لبايتات الحِملة المُرمّزة، يقرأ هذا المقطع تدفق urllib3 الخام دون فك ترميز المحتوى:
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 هو مخرج الاستجابة الموجود. يجب أن تتبع حالته ورؤوسه السياسة المختارة مسبقًا؛ هذا المقطع لا ينفّذ خادم وكيل كاملًا.
تأطير النقل منفصل عن ترميز محتوى gzip. لقد تعاملت مكتبة HTTP العلوية مع التأطير بالفعل، بما في ذلك إزالة القطع، لذا لا تنسخ Transfer-Encoding بشكل أعمى. يضع الخادم السفلي إطار استجابته الخاصة حتى عندما تبقى الحِملة مُرمّزة بـ gzip.
response.text يليه ترميز UTF-8 يغيّر التمثيل أيضًا ولا يمكنه الحفاظ على بيانات ثنائية عشوائية. أغلق استجابة المنبع أو استهلكها في كل مسار، وتعامل مع أخطاء HTTP وفق عقد الوكيل: هذا المثال يرفعها بدلًا من تمريرها.