Stuur gzip-bytes door met de headers die ze beschrijven
Kies gecodeerde of gedecodeerde payloads in een proxy op basis van Requests en geef de downstreamrespons bijpassende content-headers en zijn eigen framing.
Als Requests een body al heeft gedecomprimeerd, vraagt doorsturen met Content-Encoding: gzip de volgende client om die opnieuw te decomprimeren. Bepaal welke payloadweergave de proxy stuurt voordat je de headers kopieert.
| Verzonden payload | Content-headers |
|---|---|
| Oorspronkelijke gecodeerde bytes | Behoud de toepasselijke codering en de exacte payloadlengte |
| Gedecodeerde bytes | Verwijder de gedecodeerde codering; verwijder of herbereken de bijbehorende lengte |
Voor gecodeerde payloadbytes leest dit fragment de ruwe stream van urllib3 zonder content-decodering:
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 is de bestaande responsuitvoer. De status en headers moeten al het gekozen beleid volgen; dit fragment implementeert geen volledige proxyserver.
Transportframing staat los van gzip content-codering. De upstream HTTP-bibliotheek heeft de framing al afgehandeld, inclusief het verwijderen van chunks, dus kopieer Transfer-Encoding niet blind. De downstreamserver kadert zijn eigen respons, zelfs wanneer de payload gzip-gecodeerd blijft.
response.text gevolgd door UTF-8-codering verandert ook de weergave en kan willekeurige binaire gegevens niet behouden. Sluit of verbruik de upstreamrespons op elk pad, en behandel HTTP-fouten volgens het proxycontract: dit voorbeeld gooit ze in plaats van ze door te sturen.