Cache-Control: no-cache でプロキシ経由のダウンロードを再検証する
ダウンロード URL を変えずに検証済みの応答を要求し、再検証と保存禁止を混同しないようにします。
ダウンロード 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 交換を扱うキャッシュには届きます。保存された応答をトンネルのせいにする前に、それが実際にどこにあるのかを確認してください。