WinHTTP が 407 と 401 を交互に返すとき
選択したプロキシ認証の状態を保持し、再試行の前に再適用します。宛先側の課題は別に扱います。
WinHTTP の要求はプロキシに対して認証し、Web サイトの 401 を受け取り、次の送信でさらに 407 を受け取ります。プロキシと Web サイトはそれぞれ別の認証状態を持ち、再送の経路はその両方を保持する必要があります。
Microsoft のネイティブな WinHTTP 認証サンプルは、選択したプロキシ方式を変数に保持し、その方式を選んだ後は各 WinHttpSendRequest の前にプロキシ アカウントを再適用します。
- 要求を送信して応答を確認します。
- 407 の場合は、提示された方式を問い合わせ、選択したプロキシ方式を覚えておきます。
- 再送の前に、その方式とアカウントで WINHTTP_AUTH_TARGET_PROXY に対して WinHttpSetCredentials を呼び出します。
- 宛先の 401 の場合は、その方式を取得してサーバー資格情報を設定し、次の送信のために記憶したプロキシ状態は保持します。
このサンプルは、サーバーの課題やリダイレクトの後に再認証することを、プロキシ資格情報を再適用する理由として明示しています。呼び出しを最初の 407 分岐だけに置くと、別の再試行経路が想定された設定を欠いたままになります。
すべての API 結果を確認し、繰り返し失敗は上限を設けます。Microsoft の簡潔なサンプルは前回の状態を追跡しますが、運用の再試行ポリシーは交互に繰り返す並びも認識すべきです。
失敗後にユーザーが代替アカウントを指定した場合は、その再送経路が使う値を更新します。WinHttpSetCredentials は要求単位のものであり、今後のすべての要求に対して内容が置き換えられるプロセス全体のパスワード ストアではありません。