Compartir a través de


Control de cookies en WinHTTP

Los datos de sesión HTTP se pasan entre el cliente y el servidor en el encabezado cookie de la solicitud o la respuesta. El servidor envía cookies al cliente en el encabezado Set-cookie de la respuesta y la API winHTTP vuelve a enviar la cookie de servidor al servidor en el encabezado de cookie de la solicitud. Las especificaciones de control de cookies, descritas en rfc 2109 (Mecanismo de administración de estado HTTP), se implementan de forma predeterminada en WinHTTP. Las especificaciones recientes de control de cookies, descritas en rfc 2964, no son compatibles con WinHTTP.

WinHTTP obtiene la cookie de los servidores Set-Cookie encabezado y la almacena en una memoria caché por sesión. Esta cookie se reentrada en las solicitudes posteriores de la misma sesión winHTTP donde el destino coincide con el origen de la cookie. La API de WinHTTP regenera el encabezado de cookie de solicitud para cada segmento de la solicitud.

En la lista siguiente se describen varias opciones que las aplicaciones cliente WinHTTP pueden usar para controlar las cookies:

  • Control automático de cookies: WinHTTP controla automáticamente las cookies y la aplicación cliente no realiza ningún control de cookies personalizado.
  • Deshabilitar el control automático de cookies: el control automático de cookies en la API winHTTP está deshabilitado y no se envían cookies.
  • Especificar manualmente todas las cookies: el control automático de cookies está deshabilitado y la aplicación cliente agrega o quita todos los encabezados de cookies para cada solicitud de la sesión.
  • Manipulación manual y automática de cookies: combine el control automático y manual de cookies.

Para deshabilitar el control de cookies, la aplicación cliente WinHTTP llama a la función WinHttpSetOption con el parámetro dwOption establecido en WINHTTP_OPTION_DISABLE_FEATURE y el parámetro lpBuffer establecido en WINHTTP_DISABLE_COOKIES. El parámetro hInternet debe ser un identificador de solicitud. Cuando el control de cookies está deshabilitado en un identificador de solicitud que ha enviado una solicitud anterior, el cliente debe quitar manualmente los encabezados de cookies de solicitud existentes con la función WinHttpAddRequestHeaders antes de enviar la siguiente solicitud. Para obtener más información, consulte Eliminación de encabezados de cookie.

Nota

La aplicación cliente debe establecer todas las cookies en la sesión una vez deshabilitado el modo automático.

Especificación manual de todas las cookies

Cuando el control automático de cookies está deshabilitado, la aplicación cliente WinHTTP tiene la opción de especificar manualmente todas las cookies. Para establecer manualmente la cookie, la aplicación llama a WinHttpAddRequestHeaders especificando el encabezado cookie en el parámetro pwszHeaders . La aplicación cliente debe borrar todos los encabezados de cookie antes de volver a enviar la solicitud.

La aplicación cliente también debe cambiar el encabezado de cookie cuando se haya redirigido la solicitud. Para cambiar la cookie en las solicitudes redirigidas, el cliente especifica una función de devolución de llamada con WinHttpSetStatusCallback que responde al caso de devolución de llamada de redirección. El controlador de devolución de llamada debe borrar la cookie enviada anteriormente en la solicitud llamando a WinHttpAddRequestHeaders. Para obtener más información sobre cómo quitar encabezados de cookie, consulte Eliminación de encabezados de cookie.

Las aplicaciones cliente winHTTP pueden combinar el mecanismo de control automático de cookies winHTTP con el control manual de cookies. La aplicación agrega cookies personalizadas al encabezado de cookie generado automáticamente antes de enviar la solicitud con la función WinHttpSendRequest . La cookie personalizada debe ser el primer encabezado de cookie en la solicitud de la API winHTTP para almacenar en caché correctamente la cookie. La aplicación cliente también debe quitar las cookies enviadas en solicitudes anteriores antes de volver a enviar una solicitud en el mismo identificador de solicitud. Para obtener más información, consulte Eliminación de encabezados de cookie.

Las cookies agregadas a una solicitud antes de la llamada a WinHttpSendRequest se incluyen en todas las solicitudes WinHTTP enviadas en nombre de las siguientes llamadas WinHttpSendRequest y WinHttpReceiveResponse . Es posible que la aplicación cliente necesite borrar el encabezado de cookie cuando se haya redirigido la solicitud. Para borrar la cookie en las solicitudes redirigidas, el cliente especifica una función de devolución de llamada con WinHttpSetStatusCallback que responde al caso de devolución de llamada de redirección. El controlador de devolución de llamada debe borrar la cookie que se envió anteriormente en la solicitud llamando a WinHttpAddRequestHeaders. Es posible que la función de devolución de llamada no establezca nuevas cookies personalizadas en la devolución de llamada de redirección. El cliente debe esperar a que WinHttpReceiveResponse finalice antes de agregar nuevas cookies para la siguiente llamada a WinHttpSendRequest .

Es posible que la aplicación cliente WinHTTP necesite borrar la cookie de solicitud existente antes de volver a enviar una solicitud para evitar que las cookies enviadas en solicitudes anteriores se envíen de nuevo en la solicitud actual; para obtener más información, vea la nota siguiente. Tenga en cuenta también que las cookies no tienen que borrarse antes de enviar la primera solicitud en el identificador de solicitud. El cliente puede borrar las cookies existentes llamando a WinHttpAddRequestHeaders con un encabezado de cookie vacío en el parámetro pwszHeaders y la marca WINHTTP_ADDREQ_FLAG_REPLACE establecida en el parámetro dwModifier . En el ejemplo de código siguiente se muestra cómo borrar el encabezado de cookie en la solicitud.

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

La API winHTTP tiene diferentes comportamientos de control de cookies para versiones del sistema operativo anteriores a Windows XP con Service Pack 2 (SP2) y Windows Server 2003 con Service Pack 1 (SP1).

**Windows XP con SP2 y versiones posteriores y Windows Server 2003 con SP1 y versiones posteriores: **

La API winHTTP borra todas las cookies enviadas en solicitudes anteriores para el identificador de solicitud. El cliente puede agregar manualmente nuevos encabezados de cookie antes de cada llamada a WinHttpSendRequest. Si la funcionalidad de control automático de cookies de la API winHTTP no se ha deshabilitado, la API de WinHTTP anexará el nuevo encabezado de cookie (o agregará un nuevo encabezado de cookie si la aplicación cliente no agredió manualmente) con la cookie del servidor.

**Windows XP con SP2 y Windows Server 2003 con SP1: **

La API de WinHTTP no borra el encabezado de cookie de solicitud una vez completada WinHttpReceiveResponse . Las cookies enviadas en solicitudes anteriores se reenviarán en llamadas posteriores a WinHttpSendRequest. La aplicación cliente WinHTTP debe borrar los encabezados de cookies existentes antes de volver a enviar una solicitud en el identificador de solicitud.