Persiųskite gzip baitus su juos aprašančiomis antraštėmis
Requests pagrindu veikiančiame proxy pasirinkite užkoduotą arba iškoduotą turinį, tada suteikite pasroviui einančiam atsakymui atitinkamas content antraštes ir savo paties kadravimą.
Jei Requests jau išskleidė kūną, jo persiuntimas su Content-Encoding: gzip prašo kito kliento išskleisti jį dar kartą. Nuspręskite, kurią turinio reprezentaciją siunčia proxy, prieš kopijuodami jo antraštes.
| Išsiųstas turinys | Content antraštės |
|---|---|
| Originalūs užkoduoti baitai | Išsaugokite taikomą kodavimą ir tikslų turinio ilgį |
| Iškoduoti baitai | Pašalinkite iškoduotą kodavimą; pašalinkite arba perskaičiuokite atitinkamą ilgį |
Užkoduotiems turinio baitams šis fragmentas skaito neapdorotą urllib3 srautą be content iškodavimo:
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 yra esama atsakymo išvestis. Jos būsena ir antraštės jau turi atitikti pasirinktą politiką; šis fragmentas neįgyvendina viso proxy serverio.
Perdavimo kadravimas atskirtas nuo gzip content kodavimo. Aukštesnio lygio HTTP biblioteka jau apdorojo kadravimą, įskaitant dalių pašalinimą, todėl nekopijuokite Transfer-Encoding aklai. Pasroviui esantis serveris kadruoja savo atsakymą net tada, kai turinys lieka užkoduotas gzip.
response.text su UTF-8 kodavimu taip pat keičia reprezentaciją ir negali išsaugoti savavališkų dvejetainių duomenų. Kiekviename kelyje uždarykite arba sunaudokite aukštesnio lygio atsakymą ir tvarkykite HTTP klaidas pagal proxy sutartį: šis pavyzdys jas išmeta, o ne persiunčia.