Teruskan byte gzip dengan header yang mendeskripsikannya
Pilih payload terenkode atau terdekode di proxy berbasis Requests, lalu berikan respons hilir header content yang sesuai dan framing-nya sendiri.
Jika Requests sudah mendekompresi body, meneruskannya dengan Content-Encoding: gzip meminta klien berikutnya mendekompresinya lagi. Tentukan representasi payload mana yang dikirim proxy sebelum menyalin headernya.
| Payload terkirim | Header content |
|---|---|
| Byte terenkode asli | Pertahankan pengodean yang berlaku dan panjang payload yang tepat |
| Byte terdekode | Hapus pengodean terdekode; hapus atau hitung ulang panjang yang sesuai |
Untuk byte payload terenkode, fragmen ini membaca aliran mentah urllib3 tanpa pendekodean 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 adalah keluaran respons yang sudah ada. Status dan headernya harus sudah mengikuti kebijakan yang dipilih; fragmen ini tidak mengimplementasikan server proxy lengkap.
Framing transfer terpisah dari pengodean content gzip. Pustaka HTTP hulu sudah menangani framing, termasuk penghapusan potongan, jadi jangan menyalin Transfer-Encoding secara buta. Server hilir membingkai responsnya sendiri bahkan ketika payload tetap terenkode gzip.
response.text yang diikuti pengodean UTF-8 juga mengubah representasi dan tidak dapat mempertahankan data biner sembarang. Tutup atau habiskan respons hulu di setiap jalur, dan tangani kesalahan HTTP sesuai kontrak proxy: contoh ini melemparkannya alih-alih meneruskannya.