Pokud Requests již tělo dekomprimoval, přeposlání s Content-Encoding: gzip žádá dalšího klienta, aby je dekomprimoval znovu. Rozhodněte, kterou reprezentaci obsahu proxy odešle, ještě před kopírováním hlaviček.

Odeslaný obsahContent hlavičky
Původní kódované bajtyZachovejte příslušné kódování a přesnou délku obsahu
Dekódované bajtyOdstraňte dekódované kódování; odstraňte nebo přepočítejte odpovídající délku

Pro kódované bajty obsahu tento fragment čte surový proud urllib3 bez dekódování 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 je stávající výstup odpovědi. Jeho stav a hlavičky již musí odpovídat zvolené politice; tento fragment neimplementuje úplný proxy server.

Rámování přenosu je oddělené od content kódování gzip. Knihovna HTTP na vstupu již rámování zpracovala, včetně odstranění částí, takže Transfer-Encoding slepě nekopírujte. Navazující server rámuje vlastní odpověď, i když obsah zůstává kódovaný gzipem.

response.text následované kódováním UTF-8 také mění reprezentaci a nemůže zachovat libovolná binární data. Na každé cestě odpověď na vstupu zavřete nebo spotřebujte a chyby HTTP zpracujte podle smlouvy proxy: tento příklad je vyhazuje místo přeposílání.

Související články