Pārsūtiet gzip baitus ar tiem atbilstošajām galvenēm
Requests balstītā starpniekserverī izvēlieties kodētu vai atkodētu datu kravu, pēc tam piešķiriet lejupstraumes atbildei atbilstošas content galvenes un savu ietvaru.
Ja Requests jau ir izvērsis pamattekstu, tā pārsūtīšana ar Content-Encoding: gzip lūdz nākamo klientu to izvērst vēlreiz. Pirms galveņu kopēšanas izlemiet, kuru datu kravas attēlojumu starpniekserveris sūta.
| Nosūtītā datu krava | Content galvenes |
|---|---|
| Sākotnējie kodētie baiti | Saglabājiet piemērojamo kodējumu un precīzo datu kravas garumu |
| Atkodētie baiti | Noņemiet atkodēto kodējumu; noņemiet vai pārrēķiniet atbilstošo garumu |
Kodētiem datu kravas baitiem šis fragments nolasa urllib3 neapstrādāto straumi bez content atkodēšanas:
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 ir esošā atbildes izvade. Tās statusam un galvenēm jau jāatbilst izvēlētajai politikai; šis fragments neievieš pilnu starpniekserveri.
Pārsūtīšanas ietvars ir atsevišķs no gzip content kodējuma. Augšupstraumes HTTP bibliotēka jau ir apstrādājusi ietvaru, tostarp daļu noņemšanu, tāpēc nekopējiet Transfer-Encoding akli. Lejupstraumes serveris ietver savu atbildi arī tad, kad datu krava paliek gzip kodēta.
response.text ar UTF-8 kodējumu arī maina attēlojumu un nevar saglabāt patvaļīgus bināros datus. Katrā ceļā aizveriet vai patērējiet augšupstraumes atbildi un apstrādājiet HTTP kļūdas saskaņā ar starpniekservera līgumu: šis piemērs tās izmet, nevis pārsūta.