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 payloadContent-headers
Oorspronkelijke gecodeerde bytesBehoud de toepasselijke codering en de exacte payloadlengte
Gedecodeerde bytesVerwijder 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.

Gerelateerde artikelen