Una vez que hemos enviado una petición a través de la red, ya sea con el método directo o detallado, será procesada por el servidor HTTP que devolverá una respuesta al cliente. Esta respuesta, como ya hemos visto, se compone de una cabecera y los datos que hemos pedido en la petición. A través de Wininet, podemos acceder tanto a los datos de cabecera (que nos proporcionan información sobre el recurso), como al recurso en sí.
Lectura de datos de cabecera
Wininet mantiene internamente la estructura de la cabecera retornada, y nos permite acceder a ella a través de una función: HttpQueryInfo.
Esta función nos facilita la lectura de datos de la cabecera, indicando el atributo del cual queremos obtener el dato.
La sintaxis es la siguiente:
BOOL HttpQueryInfo(
HINTERNET hPetición,
DWORD dwInformación,
LPVOID lpBuffer,
LPDWORD lpdwLongitudBuffer,
LPDWORD lpdwIndice
);
- hPetición: un descriptor de petición, obtenido a través de la función InternetOpenUrl (o HttpOpenRequest, utilizando el método detallado, aunque no lo hayamos explicado).
- dwInformación: es un valor combinado entre el atributo a leer y los modificadores que podemos aplicar. A continuación doy una lista de los atributos más importantes que podemos leer, aunque se puede consultar una lista más completa en web del MSDN de Microsoft∞.
La mayoría de estas contantes corresponden con un atributo de la respuesta del protocolo HTTP, como Last-Modified, Content-Type, etc.
- HTTP_QUERY_STATUS_CODE: el código de retorno devuelto por el servidor.
- HTTP_QUERY_STATUS_TEXT: descripción del estado devuelto por el servidor.
- HTTP_QUERY_DATE: fecha y hora en que se originó la petición.
- HTTP_QUERY_SERVER: información acerca del servidor HTTP que ha generado esta respuesta.
- HTTP_QUERY_MIME_VERSION: la versión de los tipos MIME utilizados en la respuesta.
- HTTP_QUERY_CONTENT_TYPE: el tipo MIME del recurso leído.
- HTTP_QUERY_CONTENT_LENGTH: el tamaño, en bytes, del recurso leído.
- HTTP_QUERY_LAST_MODIFIED: fecha y hora de la última modificación el recurso.
- HTTP_QUERY_CUSTOM: nos permite buscar un atributo dentro de las cabeceras adicionales pasadas durante la llamada a InternetOpenUrl o HttpSendRequest. El nombre de la cabecera que queremos buscar debemos pasarlo a través del parámetro lpBuffer.
- HTTP_QUERY_EXPIRES: la fecha y hora a partir de la cual se considera el recurso como caducado.
- HTTP_QUERY_ALLOW: consulta las operaciones soportadas por el servidor.
- HTTP_QUERY_REQUEST_METHOD: el tipo de operación que se ha utilizado en la petición.
- HTTP_QUERY_ACCEPT: los tipos de datos MIME que acepta el servidor.
- HTTP_QUERY_RAW_HEADERS: retorna toda la cabecera recibida. Cada atributo está terminado por el carácter 0 y la secuencia final está terminada por un doble carácter 0, del siguiente modo: "attr: valor\0attr: valor\0attr: valor\0\0"
- HTTP_QUERY_RAW_HEADERS_CRLF: igual que el anterior, pero se separa cada cabecera por un retorno de carro, del siguiente modo: "attr: valor\nattr: valor\nattr: valor\0"
Además de los atributos posibles, se puede combinar con alguno de los siguientes modificadores:
- HTTP_QUERY_FLAG_NUMBER: retorna el atributo pedido como si fuera un número de 32 bits (por ejemplo en el atributo Content-Length).
- HTTP_QUERY_FLAG_SYSTEMTIME: retorna el atributo pedido como una estructura de tipo SYSTEMTIME. Se puede ver una descripción de la estructura SYSTEMTIME aquí ∞.
Esta bandera puede utilizarse para retornar cualquier atributo de tipo fecha-hora como Last-Modified, Expires, etc.
- lpBuffer: un puntero a un espacio de memoria donde se almacenará el atributo que hemos pedido a través del parámetro dwInformación. El atributo se retornará en formato cadena, a no ser que se haya utilizado alguna bandera de modificación, en cuyo caso se retornará en el formato indicado (número o estructura SYSTEMTIME).
- lpdwLongitudBuffer: un puntero a un número de 32 bits que almacena el tamaño del buffer pasado en lpBuffer. Cuando la función retorna, almacena en este parámetro el tamaño en bytes del valor retornado (incluido el carácter nulo final para cadenas) o bien el tamaño en bytes requerido si la función ha retornado FALSE y GetLastError nos ha devuelto el código de error ERROR_INSUFFICIENT_BUFFER.
- lpdwIndice: cuando se retorna un atributo con varios valores (como HTTP_QUERY_ACCEPT), este valor indica el índice (comenzando en 0) del valor a obtener. Al retornar, la función almacena en este parámetro el índice del siguiente valor, o el valor de la contstante ERROR_HTTP_HEADER_NOT_FOUND si ya no hay más valores. Si se va a consultar un atributo sencillo, se debe pasar el valor 0.
La función retornará TRUE o FALSE dependiendo del éxito o fracaso. En caso de error, debemos llamar a GetLastError para averiguar las razones del fracaso (retornará, por ejemplo el valor ERROR_INSUFFICIENT_BUFFER si el tamaño de la memoria en lpBuffer es demasiado pequeño).