Todos sabemos lo que son estas pequeñas
galletas (
cookies) que últimamente las vemos aparecer por cualquier lado. Para los olvidadizos, diremos que una
cookie es un pequeño archivo almacenado por una página web en nuestro disco duro, para grabar en él datos de configuración, preferencias de usuario, contraseñas, etc. De este modo, la página en cuestión es capaz de reconocernos al entrar en la página, o saber si ha habido cambios desde nuestra última visita.
Desde el propio API Wininet también es posible gestionar estos pequeños archivos, sin tener que recurrir al navegador, Javascript, CGI o cualquier otro sistema de programación web.
Las
cookies están asociadas a una URL concreta, así que por cada URL podremos tener un sólo archivo de configuración, y dentro de él, uno o varios pares de datos "variable-valor".
Existen dos tipos de
cookies, las que tienen fecha de caducidad, y las que se eliminan al terminar una sesión de internet.
Las primeras (llamadas
cookies persistentes) deben crearse indicando la fecha a partir de la cual dejan de ser válidas.
Las segundas (llamadas
cookies de sesión) se crean sin ninguna fecha, y no se almacenarán en el disco duro, sino que permanecen en memoria hasta el final del proceso que las creó.
Las funciones para manipular las
cookies son sencillas:
InternetSetCookie
Esta función nos permite almacenar una
cookie en nuestro sistema a partir de la URL especificada. Para realizar esta operación, se consultará en los parámetros de seguridad configurados en Internet Explorer, por lo que es posible que aparezca una ventana de aviso o restricción si así está configurado.
BOOL InternetSetCookie(
LPCTSTR lpszUrl,
LPCTSTR lpszVariable,
LPCTSTR lpszValor
);
- lpszUrl: la URL asociada a la cookie. Si ya hay alguna cookie para esta URL, se utilizará el mismo archivo en el disco duro, en caso contrario, se creará uno nuevo.
- lpszVariable: nombre de la variable a almacenar. Este será un nombre que posteriormente utilizaremos para leer el valor. Si pasamos el valor NULL (lo más habitual), se buscará el nombre dentro de la cadena lpszValor.
- lpszValor: valor asociado a la variable. Además del valor en sí, se pueden incluír otras palabras clave para configurar el comportamiento de la cookie. La sintaxis general de esta cadena es:
<variable>=<valor>; [; expires=<fecha> [; domain=<nombre_dominio>]]
[; path=<ruta>] [; secure] [; httponly]Los valores encerrados entre < y > indican que debe sustituírse por un valor concreto, y los encerrados entre [ y ] son opcionales. Los distintas opciones tienen los siguientes significados:
- expires: indica la fecha de caducidad para la cookie. El valor <fecha> debe ser una fecha y hora según el meridiano de Greewich y debe indicarse en formato DIA, DD-MMM-AAAA HH:MM:SS GTM, donde:
- DIA: es el día de la semana, en inglés. Los posibles valores son: Mon, Tue, Wed, Thu, Fri, Sat y Sun.
- DD-MMM-AAAA, la fecha en este formato. Los meses deben indicarse con las tres primeras letras de su nombre en inglés, siendo los siguientes valores los posibles: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov y Dec.
- HH:MM:SS: la hora según este formato. La parte de horaria debe indicarse en el formato 24 horas.
- GMT: esto es una constante que debe aparecer al final de la cadena, indicando que la fecha representa un valor correcto para el meridiano de Greenwich.
- domain: indica el dominio a partir del cual la cookie es válida. Por ejemplo, si indicamos como dominio "ideas.grupoalbor.com", la cookie será válida para cualquier URL dentro de este dominio y subdominios. Este parámetros sólo es válido para cookies persistentes por lo que será ignorado si no indicamos una fecha de caducidad.
- path: indica la ruta en el servidor a partir de la cual la cookie es válida. Por ejemplo, si indicamos la ruta "/ideas/delphi", la cookie será válida para las URLs de esta ruta, o cualquier otra dentro de esta.
- secure: indica que la cookie sólo se transmitirá y será válida si estamos accediendo a la URL a través del protocolo HTTPS (HTTP secure).
- httponly: indica que la cookie será codificada para leerse sólo desde los protocolos HTTP y HTTPS. En nuestro caso, esto significa que Wininet no tendría acceso a esta cookie.
La función retornará un valor booleano indicando éxito o fracaso.
InternetGetCookie
Esta función nos permite recuperar los valores de una cookie que previamente hayamos almacenado, ya sea a través de la función InternetSetCookie o desde una página web.
BOOL InternetGetCookie(
LPCTSTR lpszUrl,
LPCTSTR lpszVariable,
LPTSTR lpszValores,
LPDWORD lpdwTamaño
);
- lpszUrl: la URL asociada a la cookie. Es la URL a partir de la que se almacenó el valor.
- lpszVariable: No está implementado, ya que esta función retorna todas las variables de una cookie dada a través del parámetro lpszValores.
- lpszValores: apunta a un buffer en el que se copiarán los valores de la cookie. La sintaxis en que se retornan es <variable>=<valor> ; <variable>=<valor> ; <variable>=<valor>... Una vez que tenemos el valor de todas las variables, podemos tratar esta cadena desde nuestro programa, por ejemplo, buscando una variable concreta. Podemos evitar que se copien estos valores , pasando un puntero NULL.
- lpdwTamaño: apunta a una variable en la que se indica el tamaño del buffer que pasamos en lpszValores. Si la función ha tenido espacio suficiente en el buffer, nos copiarán en esta variable el número de caracteres copiados. Si no ha tenido espacio suficiente, o hemos pasado lpszValores a NULL, nos retornará el número de caracteres necesarios para copiar la cookie completa.
La función retornará TRUE o FALSE dependiendo de su éxito. En caso de error, GetLastError nos puede devolver alguno de estos errores, entre otros:
- ERROR_NO_MORE_ITEMS: No hay ninguna cookie asociada a la URL indicada.
- ERROR_INSUFFICIENT_BUFFER: el buffer pasado en lpszValores es demasiado pequeño. En este caso se nos copiará en la variable dwTamaño el espacio requerido.