Encaminhe os bytes gzip com os cabeçalhos que os descrevem
Escolha payloads codificados ou decodificados num proxy baseado em Requests e depois dê à resposta a jusante cabeçalhos de conteúdo correspondentes e o seu próprio enquadramento.
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 enviado | Cabeçalhos de conteúdo |
|---|---|
| Bytes codificados originais | Mantenha a codificação aplicável e o comprimento exato do payload |
| Bytes descodificados | Remova 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.