Поделиться через


Обработка файлов cookie в WinHTTP

Данные сеанса HTTP передаются между клиентом и сервером в заголовке файла cookie запроса или ответа. Сервер отправляет файлы cookie клиенту в заголовке Set-cookie ответа, а API WinHTTP повторно отправляет файл cookie сервера на сервер в заголовке файла cookie запроса. Спецификации обработки файлов cookie, описанные в rfc 2109 (механизм управления состоянием HTTP), реализованы по умолчанию в WinHTTP. Последние спецификации обработки файлов cookie, описанные в rfc 2964, не поддерживаются WinHTTP.

WinHTTP получает файл cookie от серверов Set-Cookie заголовка и сохраняет его в кэше для каждого сеанса. Этот файл cookie повторно отправляется на последующие запросы в том же сеансе WinHTTP, где целевой объект соответствует источнику файла cookie. API WinHTTP повторно создает заголовок файла cookie для каждого этапа запроса.

В следующем списке описано несколько вариантов, которые клиентские приложения WinHTTP могут использовать для обработки файлов cookie:

  • Автоматическая обработка файлов cookie. WinHTTP автоматически обрабатывает файлы cookie, а клиентское приложение не выполняет настраиваемую обработку файлов cookie.
  • Отключить автоматическую обработку файлов cookie — автоматическая обработка файлов cookie в API WinHTTP отключена и файлы cookie не отправляются.
  • Указание всех файлов cookie вручную — автоматическая обработка файлов cookie отключена, а клиентское приложение добавляет или удаляет все заголовки файлов cookie для каждого запроса в сеансе.
  • Ручная и автоматическая обработка файлов cookie — объединяйте автоматическую и ручную обработку файлов cookie.

Чтобы отключить обработку файлов cookie, клиентское приложение WinHTTP вызывает функцию WinHttpSetOption с параметром dwOption , равным WINHTTP_OPTION_DISABLE_FEATURE, а параметру lpBufferзначение WINHTTP_DISABLE_COOKIES. Параметр hInternet должен быть дескриптором запроса. Если обработка файлов cookie отключена для дескриптора запроса, отправляющего предыдущий запрос, клиент должен вручную удалить существующие заголовки файлов cookie с помощью функции WinHttpAddRequestHeaders перед отправкой следующего запроса. Дополнительные сведения см. в разделе Удаление заголовков файлов cookie.

Примечание

Клиентское приложение должно настроить все файлы cookie в сеансе после отключения автоматического режима.

Указание всех файлов cookie вручную

Если автоматическая обработка файлов cookie отключена, клиентское приложение WinHTTP может вручную указать все файлы cookie. Чтобы вручную задать файл cookie, приложение вызывает WinHttpAddRequestHeaders , указывая заголовок файла cookie в параметре pwszHeaders . Клиентское приложение должно очистить все заголовки файлов cookie перед повторной отправкой запроса.

Клиентское приложение также должно изменить заголовок файла cookie при перенаправлении запроса. Чтобы изменить файл cookie для перенаправленных запросов, клиент указывает функцию обратного вызова с помощью WinHttpSetStatusCallback , которая реагирует на обратный вызов перенаправления. Обработчик обратного вызова должен очистить файл cookie, ранее отправленный по запросу, вызвав WinHttpAddRequestHeaders. Дополнительные сведения об удалении заголовков файлов cookie см. в разделе Удаление заголовков файлов cookie.

Клиентские приложения WinHTTP могут сочетать механизм автоматической обработки файлов cookie WinHTTP с обработкой файлов cookie вручную. Приложение добавляет пользовательские файлы cookie в автоматически созданный заголовок файла cookie перед отправкой запроса с помощью функции WinHttpSendRequest . Пользовательский файл cookie должен быть первым заголовком файла cookie в запросе к API WinHTTP для правильного кэширования файла cookie. Клиентское приложение также должно удалить файлы cookie, отправленные в предыдущих запросах, перед повторной отправкой запроса на тот же дескриптор запроса. Дополнительные сведения см. в разделе Удаление заголовков файлов cookie.

Файлы cookie, добавленные в запрос перед вызовом WinHttpSendRequest , включаются во все запросы WinHTTP, отправленные от имени следующих вызовов WinHttpSendRequest и WinHttpReceiveResponse . Клиентскому приложению может потребоваться очистить заголовок файла cookie при перенаправлении запроса. Чтобы очистить файл cookie для перенаправленных запросов, клиент указывает функцию обратного вызова с помощью WinHttpSetStatusCallback , которая отвечает на обратный вызов перенаправления. Обработчик обратного вызова должен очистить файл cookie, который ранее был отправлен по запросу, вызвав WinHttpAddRequestHeaders. Функция обратного вызова может не устанавливать новые пользовательские файлы cookie для обратного вызова перенаправления. Клиент должен дождаться завершения WinHttpReceiveResponse , прежде чем добавлять новые файлы cookie для следующего вызова WinHttpSendRequest .

Клиентскому приложению WinHTTP может потребоваться очистить существующий файл cookie запроса перед повторной отправкой запроса, чтобы предотвратить повторную отправку файлов cookie, отправленных по предыдущим запросам, в текущем запросе; Дополнительные сведения см. в следующем примечании. Кроме того, имейте в виду, что файлы cookie не обязательно очищаются перед отправкой первого запроса на дескриптор запроса. Клиент может очистить существующие файлы cookie, вызвав WinHttpAddRequestHeaders с пустым заголовком файла cookie в параметре pwszHeaders и флагом WINHTTP_ADDREQ_FLAG_REPLACE, установленным в параметре dwModifier . В следующем примере кода показано, как очистить заголовок файла cookie в запросе.

WinHttpAddRequestHeaders(hRequest, 
                         L"Cookie:", 
                         -1, 
                         WINHTTP_ADDREQ_FLAG_REPLACE);

API WinHTTP имеет разные режимы обработки файлов cookie для версий операционной системы, предшествующих Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1).

**Windows XP с пакетом обновления 2 (SP2) и более поздних версий и Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий: **

API WinHTTP очищает все файлы cookie, отправленные в предыдущие запросы для дескриптора запроса. Клиент может вручную добавлять новые заголовки файлов cookie перед каждым вызовом WinHttpSendRequest. Если функция автоматической обработки файлов cookie API WinHTTP не была отключена, API WinHTTP добавит новый заголовок файла cookie (или новый заголовок файла cookie, если клиентское приложение не добавило его вручную) к файлу cookie с сервера.

**Windows XP с пакетом обновления 2 (SP2) и Windows Server 2003 с пакетом обновления 1 (SP1): **

API WinHTTP не очищает заголовок файла cookie запроса после завершения WinHttpReceiveResponse . Файлы cookie, отправленные в предыдущих запросах, будут повторно отправляться в последующих вызовах WinHttpSendRequest. Клиентское приложение WinHTTP должно очистить существующие заголовки файлов cookie перед повторной отправкой запроса на дескриптор запроса.