Se Requests xa descomprimiu un corpo, reenvialo con Content-Encoding: gzip pide ao seguinte cliente que o descomprima de novo. Decide que representación da carga envía o proxy antes de copiar as súas cabeceiras.

Carga enviadaCabeceiras de contido
Bytes codificados orixinaisConserva a codificación aplicable e a lonxitude exacta da carga
Bytes descodificadosElimina a codificación descodificada; elimina ou recalcula a lonxitude correspondente

Para os bytes de carga codificados, este fragmento le o fluxo en bruto de urllib3 sen descodificación de contido:

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 é a saída de resposta existente. O seu estado e as súas cabeceiras xa deben seguir a política escollida; este fragmento non implementa un servidor proxy completo.

O encadramento de transferencia é independente da codificación de contido gzip. A biblioteca HTTP de orixe xa xestionou o encadramento, incluída a eliminación de fragmentos, así que non copies Transfer-Encoding ás cegas. O servidor de destino encadra a súa propia resposta mesmo cando a carga segue codificada con gzip.

response.text seguido de codificación UTF-8 tamén cambia a representación e non pode conservar datos binarios arbitrarios. Pecha ou consume a resposta de orixe en cada ruta e xestiona os erros HTTP segundo o contrato do proxy: este exemplo lánzaos en lugar de reenvialos.

Artigos relacionados