Jeśli Requests już zdekompresował treść, przekazanie jej z Content-Encoding: gzip prosi następnego klienta o ponowne zdekompresowanie. Zdecyduj, którą reprezentację ładunku wysyła proxy, zanim skopiujesz jego nagłówki.

Wysłany ładunekNagłówki content
Oryginalne zakodowane bajtyZachowaj odpowiednie kodowanie i dokładną długość ładunku
Zdekodowane bajtyUsuń zdekodowane kodowanie; usuń lub ponownie oblicz odpowiednią długość

Dla zakodowanych bajtów ładunku ten fragment czyta surowy strumień urllib3 bez dekodowania content:

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 to istniejące wyjście odpowiedzi. Jego status i nagłówki muszą już podlegać wybranej polityce; ten fragment nie implementuje pełnego serwera proxy.

Ramowanie transferu jest oddzielone od kodowania content gzip. Biblioteka HTTP nadrzędna już obsłużyła ramowanie, w tym usuwanie fragmentów, więc nie kopiuj Transfer-Encoding bezmyślnie. Serwer podrzędny ramuje własną odpowiedź, nawet gdy ładunek pozostaje zakodowany gzip.

response.text z kodowaniem UTF-8 również zmienia reprezentację i nie może zachować dowolnych danych binarnych. Zamykaj lub zużywaj odpowiedź nadrzędną na każdej ścieżce i obsługuj błędy HTTP zgodnie z kontraktem proxy: ten przykład je zgłasza zamiast przekazywać.

Powiązane artykuły