Se Requests ha già decompresso un corpo, inoltrarlo con Content-Encoding: gzip chiede al client successivo di decomprimerlo di nuovo. Decidi quale rappresentazione del payload invia il proxy prima di copiarne le intestazioni.

Payload inviatoIntestazioni content
Byte codificati originaliMantieni la codifica applicabile e la lunghezza esatta del payload
Byte decodificatiRimuovi la codifica decodificata; rimuovi o ricalcola la lunghezza corrispondente

Per i byte di payload codificati, questo frammento legge il flusso grezzo di urllib3 senza decodifica content:

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 è l'output di risposta esistente. Il suo stato e le sue intestazioni devono già seguire la politica scelta; questo frammento non implementa un server proxy completo.

Il framing del trasferimento è separato dalla codifica content gzip. La libreria HTTP a monte ha già gestito il framing, inclusa la rimozione dei blocchi, quindi non copiare Transfer-Encoding alla cieca. Il server a valle incornicia la propria risposta anche quando il payload resta codificato con gzip.

response.text seguito dalla codifica UTF-8 cambia anch'esso la rappresentazione e non può conservare dati binari arbitrari. Chiudi o consuma la risposta a monte su ogni percorso e gestisci gli errori HTTP secondo il contratto del proxy: questo esempio li solleva invece di inoltrarli.

Articoli correlati