بایتهای 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 را مطابق قرارداد پروکسی مدیریت کنید: این مثال آنها را بهجای ارسال، پرتاب میکند.