Adres URL pobierania jest poprawny, ale współdzielone proxy nadal ma zapisaną odpowiedź. Jeśli operacja wymaga odpowiedzi zweryfikowanej u źródła, umieść to wymaganie w żądaniu:

from urllib.request import ProxyHandler, Request, build_opener
import shutil

opener = build_opener(ProxyHandler({
    "https": "http://proxy.example:8080",
}))
request = Request(download_url, headers={"Cache-Control": "no-cache"})
with opener.open(request, timeout=15) as response:
    shutil.copyfileobj(response, output)

Ten fragment zakłada, że aplikacja posiada binarny strumień wyjściowy i dostarcza HTTPS download_url. Aby wypróbować dozwolone publiczne pobieranie bez uwierzytelniania proxy, użyj kandydata punktu końcowego HTTP z listy proxy HTTP w openerze; wymaganie dotyczące pamięci podręcznej pozostaje takie samo. Zachowuje pierwotny adres URL zasobu, prosząc jednocześnie pamięci podręczne na ścieżce żądania o walidację przed ponownym użyciem.

Walidacja może ponownie wykorzystać zapisane bajty

Zgodna pamięć podręczna, która otrzyma no-cache, nie może spełnić tego żądania z zapisanej odpowiedzi bez udanej walidacji u źródła. Źródło może potwierdzić, że zapisana reprezentacja nadal jest ważna, więc operacja nie musi ponownie przesyłać niezmienionego pliku ze źródła.

max-age=0 w żądaniu wyraża limit wieku. Jest przydatne, gdy aplikacja chce odpowiedzi nie starszej niż ten limit, ale nie jest zakazem przechowywania. Odpowiedź, która właśnie powstała, może go spełnić.

Dodanie losowego parametru zapytania prosi o inny docelowy URI. Może to utworzyć kolejny wpis w pamięci podręcznej, a nawet zmienić odpowiedź aplikacji. Parametru zapytania używaj tylko wtedy, gdy jest częścią zamierzonego interfejsu zasobu.

W zwykłym HTTPS CONNECT proxy tunelujące nie widzi tego nagłówka wewnątrz TLS. Zasada nadal może dotrzeć do źródła i pamięci podręcznych obsługujących odszyfrowaną wymianę HTTP. Sprawdź, gdzie faktycznie znajduje się zapisana odpowiedź, zanim przypiszesz ją tunelowi.

Powiązane artykuły