Přeposílejte bajty gzip s hlavičkami, které je popisují
V proxy založeném na Requests zvolte kódovaný nebo dekódovaný obsah a poté dejte navazující odpovědi odpovídající content hlavičky a vlastní rámování.
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ý obsah | Content hlavičky |
|---|---|
| Původní kódované bajty | Zachovejte příslušné kódování a přesnou délku obsahu |
| Dekódované bajty | Odstraň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í.