Recuperando cabeçalhos HTTP

Este tutorial descreve como recuperar informações de cabeçalho de solicitações HTTP.

Etapas de implementação

Há duas maneiras de recuperar as informações de cabeçalho:

  • Use uma das constantes do Sinalizador de Informações de Consulta associadas ao cabeçalho HTTP de que seu aplicativo precisa.
  • Use o sinalizador de atributo HTTP_QUERY_CUSTOM e passe o nome do cabeçalho HTTP.

O uso da constante associada ao cabeçalho HTTP que seu aplicativo precisa é mais rápido internamente, mas pode haver cabeçalhos HTTP que não têm uma constante associada a eles. Para esses casos, o método que usa o sinalizador de atributo HTTP_QUERY_CUSTOM está disponível.

Ambos os métodos usam a função HttpQueryInfo . HttpQueryInfo usa o identificador HINTERNET no qual a solicitação HTTP foi feita, um atributo, um buffer, um valor DWORD que contém o tamanho do buffer e um valor de índice. Um modificador também pode ser adicionado ao atributo passado para HttpQueryInfo para indicar em qual formato os dados devem ser retornados.

Recuperando cabeçalhos usando uma constante

Para usar a função HttpQueryInfo para recuperar um cabeçalho HTTP usando uma constante, siga estas etapas:

  1. Chame HttpQueryInfo com uma constante da lista Atributos , um buffer NULL e a variável que mantém o tamanho do buffer definido como zero. Além disso, se o aplicativo precisar dos dados em um formato específico, você poderá adicionar uma constante da lista Modificadores .
  2. Se o cabeçalho HTTP solicitado existir, a chamada para HttpQueryInfo deverá falhar, GetLastError deverá retornar ERROR_INSUFFICIENT_BUFFER e a variável passada para o parâmetro lpdwBufferLength deverá ser definida como o número de bytes necessários.
  3. Aloque um buffer com o número de bytes necessários.
  4. Tente novamente a chamada para HttpQueryInfo.

O exemplo a seguir demonstra uma chamada para HttpQueryInfo usando a constante HTTP_QUERY_RAW_HEADERS_CRLF, que é um valor especial que solicita todos os cabeçalhos HTTP retornados.

// 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;
}

Recuperando cabeçalhos usando HTTP_QUERY_CUSTOM

Para usar a função HttpQueryInfo para recuperar um cabeçalho HTTP usando HTTP_QUERY_CUSTOM, siga estas etapas:

  1. Aloque um buffer grande o suficiente para manter o nome da cadeia de caracteres do cabeçalho HTTP.
  2. Escreva o nome da cadeia de caracteres do cabeçalho HTTP no buffer.
  3. Chame HttpQueryInfo com HTTP_QUERY_CUSTOM, o buffer que contém o nome da cadeia de caracteres do cabeçalho HTTP e a variável que contém o tamanho do buffer. Além disso, se o aplicativo precisar dos dados em um formato específico, você poderá adicionar uma constante da lista Modificadores .
  4. Se a chamada para HttpQueryInfo falhar e GetLastError retornar ERROR_INSUFFICIENT_BUFFER, realoque um buffer com o número de bytes necessários.
  5. Escreva o nome da cadeia de caracteres do cabeçalho HTTP no buffer novamente.
  6. Tente novamente a chamada para HttpQueryInfo.

O exemplo a seguir demonstra uma chamada para HttpQueryInfo usando a constante HTTP_QUERY_CUSTOM para solicitar o cabeçalho HTTP do tipo conteúdo.

// 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;
}

Observação

O WinINet não dá suporte a implementações de servidor. Além disso, ele não deve ser usado de um serviço. Para implementações ou serviços de servidor, use o Microsoft Windows SERVIÇOS HTTP (WinHTTP).