Posredujte bajte gzip z glavami, ki jih opisujejo
V proxyju na osnovi Requests izberite kodirano ali dekodirano koristno obremenitev, nato pa odgovoru navzdol dodelite ustrezne content glave in lastno okvirjanje.
Če je Requests telo že dekomprimiral, posredovanje z Content-Encoding: gzip zahteva od naslednjega odjemalca, da ga znova dekomprimira. Odločite se, katero predstavitev obremenitve pošilja proxy, preden kopirate glave.
| Poslana obremenitev | Content glave |
|---|---|
| Izvirni kodirani bajti | Ohranite veljavno kodiranje in natančno dolžino obremenitve |
| Dekodirani bajti | Odstranite dekodirano kodiranje; odstranite ali znova izračunajte ustrezno dolžino |
Za kodirane bajte obremenitve ta del bere surov tok urllib3 brez content dekodiranja:
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 obstoječi izhod odgovora. Njegovo stanje in glave morajo že slediti izbrani politiki; ta del ne izvaja popolnega proxy strežnika.
Okvirjanje prenosa je ločeno od gzip content kodiranja. Knjižnica HTTP navzgor je okvirjanje že obdelala, vključno z odstranjevanjem delov, zato Transfer-Encoding ne kopirajte na slepo. Strežnik navzdol okvirja svoj odgovor, tudi ko obremenitev ostane kodirana z gzip.
response.text s kodiranjem UTF-8 prav tako spremeni predstavitev in ne more ohraniti poljubnih binarnih podatkov. Na vsaki poti zaprite ali porabite odgovor navzgor in obravnavajte napake HTTP v skladu s pogodbo proxy: ta primer jih vrže, namesto da bi jih posredoval.