Recuperación de encabezados HTTP

En este tutorial se describe cómo recuperar información de encabezado de solicitudes HTTP.

Pasos de implementación

Hay dos maneras de recuperar la información de encabezado:

  • Use una de las constantes de marca de información de consulta asociadas al encabezado HTTP que necesita la aplicación.
  • Use la marca de atributo HTTP_QUERY_CUSTOM y pase el nombre del encabezado HTTP.

El uso de la constante asociada con el encabezado HTTP que necesita la aplicación es más rápido internamente, pero puede haber encabezados HTTP que no tengan una constante asociada a ellos. En esos casos, el método que usa la marca de atributo HTTP_QUERY_CUSTOM está disponible.

Ambos métodos usan la función HttpQueryInfo . HttpQueryInfo toma el identificador HINTERNET en el que se realizó la solicitud HTTP, un atributo, un búfer, un valor DWORD que contiene el tamaño del búfer y un valor de índice. También se puede agregar un modificador al atributo pasado a HttpQueryInfo para indicar en qué formato se deben devolver los datos.

Recuperar encabezados mediante una constante

Para usar la función HttpQueryInfo para recuperar un encabezado HTTP mediante una constante, siga estos pasos:

  1. Llame a HttpQueryInfo con una constante de la lista Atributos , un búfer NULL y la variable que contiene el tamaño del búfer establecido en cero. Además, si la aplicación necesita los datos en un formato determinado, puede agregar una constante de la lista Modificadores .
  2. Si existe el encabezado HTTP solicitado, se debe producir un error en la llamada a HttpQueryInfo , GetLastError debe devolver ERROR_INSUFFICIENT_BUFFER y la variable pasada para el parámetro lpdwBufferLength debe establecerse en el número de bytes necesarios.
  3. Asigne un búfer con el número de bytes necesarios.
  4. Vuelva a intentar la llamada a HttpQueryInfo.

En el ejemplo siguiente se muestra una llamada a HttpQueryInfo mediante la constante HTTP_QUERY_RAW_HEADERS_CRLF, que es un valor especial que solicita todos los encabezados HTTP devueltos.

// Retrieving Headers Using a Constant
BOOL SampleCodeOne(HINTERNET hHttp)
{
   LPVOID lpOutBuffer=NULL;
   DWORD dwSize = 0;

retry:

   // This call will fail on the first pass, because
   // no buffer is allocated.
   if(!HttpQueryInfo(hHttp,HTTP_QUERY_RAW_HEADERS_CRLF,
      (LPVOID)lpOutBuffer,&dwSize,NULL))
   {
      if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
      {
         // Code to handle the case where the header isn't available.
         return TRUE;
      }
      else
      {
        // Check for an insufficient buffer.
        if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
        {
            // Allocate the necessary buffer.
            lpOutBuffer = new char[dwSize];

            // Retry the call.
            goto retry;
        }
        else
        {
            // Error handling code.
            if (lpOutBuffer)
            {
               delete [] lpOutBuffer;
            }
            return FALSE;
        }
      }
   }

   if (lpOutBuffer)
   {
      delete [] lpOutBuffer;
   }

   return TRUE;
}

Recuperación de encabezados mediante HTTP_QUERY_CUSTOM

Para usar la función HttpQueryInfo para recuperar un encabezado HTTP mediante HTTP_QUERY_CUSTOM, siga estos pasos:

  1. Asigne un búfer lo suficientemente grande como para contener el nombre de cadena del encabezado HTTP.
  2. Escriba el nombre de cadena del encabezado HTTP en el búfer.
  3. Llame a HttpQueryInfo con HTTP_QUERY_CUSTOM, el búfer que contiene el nombre de cadena del encabezado HTTP y la variable que contiene el tamaño del búfer. Además, si la aplicación necesita los datos en un formato determinado, puede agregar una constante de la lista Modificadores .
  4. Si se produce un error en la llamada a HttpQueryInfo y GetLastError devuelve ERROR_INSUFFICIENT_BUFFER, reasigna un búfer con el número de bytes necesarios.
  5. Vuelva a escribir el nombre de cadena del encabezado HTTP en el búfer.
  6. Vuelva a intentar la llamada a HttpQueryInfo.

En el ejemplo siguiente se muestra una llamada a HttpQueryInfo mediante la constante HTTP_QUERY_CUSTOM para solicitar el encabezado HTTP Content-Type.

// Retrieving Headers Using HTTP_QUERY_CUSTOM
BOOL SampleCodeTwo(HINTERNET hHttp)
{
    DWORD dwSize = 20;
    LPVOID lpOutBuffer = new char[dwSize];

    StringCchPrintfA((LPSTR)lpOutBuffer,dwSize,"Content-Type");

retry:

    if(!HttpQueryInfo(hHttp,HTTP_QUERY_CUSTOM,
        (LPVOID)lpOutBuffer,&dwSize,NULL))
    {
        if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
        {
            // Code to handle the case where the header isn't available.
            delete [] lpOutBuffer;
            return TRUE;
        }
        else
        {
            // Check for an insufficient buffer.
            if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
            {
                // Allocate the necessary buffer.
                delete [] lpOutBuffer;
                lpOutBuffer = new char[dwSize];

                // Rewrite the header name in the buffer.
                StringCchPrintfA((LPSTR)lpOutBuffer,
                                 dwSize,"Content-Type");

                // Retry the call.
                goto retry;
            }
            else
            {
                // Error handling code.
                delete [] lpOutBuffer;
                return FALSE;
            }
        }
    }

   return TRUE;
}

Nota

WinINet no admite implementaciones de servidor. Además, no se debe usar desde un servicio. En el caso de las implementaciones de servidor o los servicios, use los servicios HTTP de Microsoft Windows (WinHTTP).