Ak Requests už dekomprimoval telo, preposlanie s Content-Encoding: gzip žiada ďalšieho klienta, aby ho dekomprimoval znova. Rozhodnite, ktorú reprezentáciu obsahu proxy odošle, ešte pred kopírovaním hlavičiek.

Odoslaný obsahContent hlavičky
Pôvodné kódované bajtyZachovajte príslušné kódovanie a presnú dĺžku obsahu
Dekódované bajtyOdstráňte dekódované kódovanie; odstráňte alebo prepočítajte zodpovedajúcu dĺžku

Pre kódované bajty obsahu tento fragment číta surový prúd urllib3 bez dekódovania 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 existujúci výstup odpovede. Jeho stav a hlavičky už musia zodpovedať zvolenej politike; tento fragment neimplementuje úplný proxy server.

Rámovanie prenosu je oddelené od content kódovania gzip. Knižnica HTTP na vstupe už rámovanie spracovala, vrátane odstránenia častí, takže Transfer-Encoding naslepo nekopírujte. Nadväzujúci server rámuje vlastnú odpoveď, aj keď obsah zostáva kódovaný gzipom.

response.text nasledované kódovaním UTF-8 tiež mení reprezentáciu a nedokáže zachovať ľubovoľné binárne dáta. Na každej ceste odpoveď na vstupe zatvorte alebo spotrebujte a chyby HTTP spracujte podľa zmluvy proxy: tento príklad ich vyhadzuje namiesto preposielania.

Súvisiace články