Reenvía los bytes gzip con las cabeceras que los describen
Elige cargas codificadas o descodificadas en un proxy basado en Requests y luego da a la respuesta posterior las cabeceras de contenido correspondientes y su propio encuadre.
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 enviada | Cabeceras de contenido |
|---|---|
| Bytes codificados originales | Conserva la codificación aplicable y la longitud exacta de la carga |
| Bytes descodificados | Elimina 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.