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 terkirimHeader content
Byte terenkode asliPertahankan pengodean yang berlaku dan panjang payload yang tepat
Byte terdekodeHapus 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.

Artikel terkait