Preposielajte bajty gzip s hlavičkami, ktoré ich opisujú
V proxy založenom na Requests vyberte kódovaný alebo dekódovaný obsah a potom dajte nadväzujúcej odpovedi zodpovedajúce content hlavičky a vlastné rámovanie.
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ý obsah | Content hlavičky |
|---|---|
| Pôvodné kódované bajty | Zachovajte príslušné kódovanie a presnú dĺžku obsahu |
| Dekódované bajty | Odstráň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.