Przekazuj bajty gzip z nagłówkami, które je opisują
Wybierz zakodowany lub zdekodowany ładunek w proxy opartym na Requests, a następnie nadaj odpowiedzi downstream pasujące nagłówki content i własne ramowanie.
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 ładunek | Nagłówki content |
|---|---|
| Oryginalne zakodowane bajty | Zachowaj odpowiednie kodowanie i dokładną długość ładunku |
| Zdekodowane bajty | Usuń 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ć.