WinHTTP での Cookie の処理
HTTP セッション データは、要求または応答の Cookie ヘッダー内のクライアントとサーバーの間で渡されます。 サーバーは応答の Set-cookie ヘッダーでクライアントに Cookie を送信し、WinHTTP API は要求の Cookie ヘッダー内のサーバーにサーバー Cookie を再送信します。 Rfc 2109 (HTTP 状態管理メカニズム) で説明されている Cookie 処理の仕様は、WinHTTP で既定で実装されます。 rfc 2964 で説明されている最近の Cookie 処理仕様は、WinHTTP ではサポートされていません。
WinHTTP は、サーバー Set-Cookie ヘッダーから Cookie を取得し、セッションごとにキャッシュに格納します。 この Cookie は、ターゲットが Cookie のソースと一致するのと同じ WinHTTP セッション内の後続の要求に再送信されます。 WinHTTP API は、要求内の各レグの要求 Cookie ヘッダーを再生成します。
次の一覧では、WinHTTP クライアント アプリケーションが Cookie の処理に使用できるいくつかのオプションについて説明します。
- 自動 Cookie 処理 - WinHTTP は Cookie を自動的に処理し、クライアント アプリケーションはカスタム Cookie 処理を実行しません。
- 自動 Cookie 処理を無効にする - WinHTTP API の自動 Cookie 処理は無効になり、Cookie は送信されません。
- すべての Cookie を手動で指定する – 自動 Cookie 処理が無効になり、クライアント アプリケーションはセッション内の各要求のすべての Cookie ヘッダーを追加または削除します。
- 手動および自動クッキー処理 - 自動クッキー処理と手動クッキー処理を組み合わせます。
自動的な Cookie 処理の無効化
Cookie 処理を無効にするために、WinHTTP クライアント アプリケーションは、dwOption パラメーターを WINHTTP_OPTION_DISABLE_FEATURE に設定し、lpBuffer パラメーターを WINHTTP_DISABLE_COOKIES に設定して WinHttpSetOption 関数を呼び出します。 hInternet パラメーターは要求ハンドルである必要があります。 以前の要求を送信した要求ハンドルで Cookie 処理が無効になっている場合、クライアントは、次の要求を送信する前に 、WinHttpAddRequestHeaders 関数を使用して既存の要求 Cookie ヘッダーを手動で削除する必要があります。 詳細については、「 Cookie ヘッダーの削除」を参照してください。
注意
クライアント アプリケーションは、自動モードが無効になった後に、セッション上のすべての Cookie を設定する必要があります。
すべての Cookie を手動で指定する
自動 Cookie 処理が無効になっている場合、WinHTTP クライアント アプリケーションには、すべての Cookie を手動で指定するオプションがあります。 Cookie を手動で設定するために、アプリケーションは pwszHeaders パラメーターに cookie ヘッダーを指定して WinHttpAddRequestHeaders を呼び出します。 クライアント アプリケーションは、要求を再送信する前に、すべての Cookie ヘッダーをクリアする必要があります。
クライアント アプリケーションは、要求がリダイレクトされたときに Cookie ヘッダーも変更する必要があります。 リダイレクトされた要求の Cookie を変更するために、クライアントはリダイレクト コールバック ケースに応答する WinHttpSetStatusCallback を使用してコールバック関数を指定します。 コールバック ハンドラーは、 WinHttpAddRequestHeaders を呼び出して、要求で以前に送信された Cookie をクリアする必要があります。 Cookie ヘッダーの削除の詳細については、「Cookie ヘッダーの 削除」を参照してください。
手動および自動 Cookie 処理
WinHTTP クライアント アプリケーションでは、WinHTTP の自動 Cookie 処理メカニズムと手動の Cookie 処理を組み合わせることができます。 アプリケーションは、 WinHttpSendRequest 関数を使用して要求を送信する前に、自動的に生成された Cookie ヘッダーにカスタム Cookie を追加します。 カスタム Cookie は、WinHTTP API が Cookie を適切にキャッシュするための要求の最初の Cookie ヘッダーである必要があります。 クライアント アプリケーションでは、同じ要求ハンドルで要求を再送信する前に、以前の要求で送信された Cookie も削除する必要があります。 詳細については、「Cookie ヘッダーの削除」を参照してください。
WinHttpSendRequest の呼び出し前に要求に追加された Cookie は、次の WinHttpSendRequest 呼び出しと WinHttpReceiveResponse 呼び出しに代わって送信されるすべての WinHTTP 要求に含まれます。 要求がリダイレクトされたときに、クライアント アプリケーションで Cookie ヘッダーをクリアする必要がある場合があります。 リダイレクトされた要求で Cookie をクリアするために、クライアントは、リダイレクト コールバック ケースに応答する WinHttpSetStatusCallback を使用してコールバック関数を指定します。 コールバック ハンドラーは、 WinHttpAddRequestHeaders を呼び出して、要求で以前に送信された Cookie をクリアする必要があります。 コールバック関数は、リダイレクト コールバックで新しいカスタム Cookie を設定できない場合があります。 クライアントは 、WinHttpReceiveResponse が完了するまで待ってから、次の WinHttpSendRequest 呼び出し用に新しい Cookie を追加する必要があります。
Cookie ヘッダーの削除
WinHTTP クライアント アプリケーションでは、以前の要求で送信された Cookie が現在の要求で再び送信されないように、要求を再送信する前に、既存の要求 Cookie をクリアする必要がある場合があります。詳細については、次の注を参照してください。 また、最初の要求が要求ハンドルで送信される前に Cookie をクリアする必要はありません。 クライアントは、pwszHeaders パラメーターで空の cookie ヘッダーを使用して WinHttpAddRequestHeaders を呼び出し、dwModifier パラメーターに設定されたWINHTTP_ADDREQ_FLAG_REPLACE フラグを使用して、既存の Cookie をクリアできます。 次のコード例は、要求で Cookie ヘッダーをクリアする方法を示しています。
WinHttpAddRequestHeaders(hRequest,
L"Cookie:",
-1,
WINHTTP_ADDREQ_FLAG_REPLACE);
WinHTTP API は、Service Pack 2 (SP2) および Windows Server 2003 Service Pack 1 (SP1) を使用する Windows XP よりも前のバージョンのオペレーティング システムに対して、異なる Cookie 処理動作を行います。
**SP2 以降の Windows XP と SP1 以降の Windows Server 2003: **
WinHTTP API は、要求ハンドルの以前の要求で送信されたすべての Cookie をクリアします。 クライアントは、WinHttpSendRequest を呼び出すたびに、新しい Cookie ヘッダーを手動で追加できます。 WinHTTP API の自動 Cookie 処理機能が無効になっていない場合、WinHTTP API は新しい Cookie ヘッダーを追加します (または、クライアント アプリケーションが手動で Cookie を追加しなかった場合は新しい Cookie ヘッダーを追加します)。
**SP2 と Windows Server 2003 SP1 の Windows XP: **
WinHttpReceiveResponse の完了後、WinHTTP API は要求 Cookie ヘッダーをクリアしません。 以前の要求で送信された Cookie は、 WinHttpSendRequest への後続の呼び出しで再送信されます。 WinHTTP クライアント アプリケーションでは、要求ハンドルで要求を再送信する前に、既存の Cookie ヘッダーをクリアする必要があります。