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 turinysContent antraštės
Originalūs užkoduoti baitaiIšsaugokite taikomą kodavimą ir tikslų turinio ilgį
Iškoduoti baitaiPaš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.

Susiję straipsniai