Si Requests ya ha descomprimido un cuerpo, reenviarlo con Content-Encoding: gzip pide al siguiente cliente que lo descomprima de nuevo. Decide qué representación de la carga envía el proxy antes de copiar sus cabeceras.

Carga enviadaCabeceras de contenido
Bytes codificados originalesConserva la codificación aplicable y la longitud exacta de la carga
Bytes descodificadosElimina la codificación descodificada; elimina o recalcula la longitud correspondiente

Para los bytes de carga codificados, este fragmento lee el flujo sin procesar de urllib3 sin descodificación de contenido:

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 es la salida de respuesta existente. Su estado y sus cabeceras ya deben seguir la política elegida; este fragmento no implementa un servidor proxy completo.

El encuadre de transferencia es independiente de la codificación de contenido gzip. La biblioteca HTTP de origen ya ha gestionado el encuadre, incluida la eliminación de fragmentos, así que no copies Transfer-Encoding a ciegas. El servidor de destino encuadra su propia respuesta incluso cuando la carga sigue codificada con gzip.

response.text seguido de codificación UTF-8 también cambia la representación y no puede conservar datos binarios arbitrarios. Cierra o consume la respuesta de origen en cada ruta y gestiona los errores HTTP según el contrato del proxy: este ejemplo los lanza en lugar de reenviarlos.

Artículos relacionados