URL загрузки верен, но у общего прокси всё ещё есть сохранённый ответ. Если операции нужен ответ, проверенный у источника, поместите это требование в запрос:

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)

Этот фрагмент предполагает, что приложение владеет двоичным потоком вывода и передаёт HTTPS download_url. Чтобы опробовать разрешённую публичную загрузку без аутентификации на прокси, используйте в opener кандидата конечной точки HTTP из списка HTTP-прокси; требование к кешу в запросе остаётся прежним. Он сохраняет исходный URL ресурса и одновременно просит кеши на пути запроса выполнить проверку перед повторным использованием.

Проверка может повторно использовать сохранённые байты

Соответствующий кеш, получив no-cache, не может удовлетворить этот запрос из сохранённого ответа без успешной проверки у источника. Источник может подтвердить, что сохранённое представление по-прежнему действительно, поэтому операции не нужно повторно передавать неизменённый файл от источника.

max-age=0 в запросе выражает ограничение по возрасту. Оно полезно, когда приложению нужен ответ не старше этого ограничения, но это не запрет на хранение. Только что созданный ответ может ему соответствовать.

Добавление случайного параметра запроса запрашивает другой целевой URI. Это может создать ещё одну запись в кеше или даже изменить ответ приложения. Используйте параметр запроса только тогда, когда он является частью задуманного интерфейса ресурса.

Для обычного HTTPS CONNECT туннелирующий прокси не видит этот заголовок внутри TLS. Политика всё же может дойти до источника и до кешей, обрабатывающих расшифрованный обмен HTTP. Проверьте, где на самом деле находится сохранённый ответ, прежде чем приписывать его туннелю.

Похожие статьи