Se o Requests já descomprimiu um corpo, encaminhá-lo com Content-Encoding: gzip pede ao cliente seguinte que o descomprima novamente. Decida que representação do payload o proxy envia antes de copiar os cabeçalhos.

Payload enviadoCabeçalhos de conteúdo
Bytes codificados originaisMantenha a codificação aplicável e o comprimento exato do payload
Bytes descodificadosRemova a codificação descodificada; remova ou recalcule o comprimento correspondente

Para bytes de payload codificados, este fragmento lê o fluxo bruto do urllib3 sem descodificação de conteúdo:

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 cabeçalhos já devem seguir a política escolhida; este fragmento não implementa um servidor proxy completo.

O enquadramento de transferência é separado da codificação de conteúdo gzip. A biblioteca HTTP a montante já tratou do enquadramento, incluindo a remoção de blocos, por isso não copie Transfer-Encoding às cegas. O servidor a jusante enquadra a sua própria resposta mesmo quando o payload continua codificado com gzip.

response.text seguido de codificação UTF-8 também altera a representação e não consegue preservar dados binários arbitrários. Feche ou consuma a resposta a montante em cada caminho e trate os erros HTTP segundo o contrato do proxy: este exemplo lança-os em vez de os encaminhar.

Artigos relacionados