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 de sinalizador de informações de consulta associadas ao cabeçalho HTTP que seu aplicativo precisa.
  • Use o _ sinalizador de _ atributo personalizado de consulta http e passe o nome do cabeçalho http.

Usar a 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 personalizado de consulta http _ 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 de atributos , um buffer nulo e a variável que mantém o tamanho do buffer definido como zero. Além disso, se seu aplicativo precisar dos dados em um formato específico, você poderá adicionar uma constante da lista de modificadores .
  2. Se o cabeçalho HTTP solicitado existir, a chamada para HttpQueryInfo deve falhar, GetLastError deve retornar um _ buffer insuficiente de erro _ e a variável passada para o parâmetro lpdwBufferLength deve ser definida como o número de bytes necessários.
  3. Aloque um buffer com o número de bytes necessários.
  4. Repita a chamada para HttpQueryInfo.

O exemplo a seguir demonstra uma chamada para HttpQueryInfo usando os _ _ cabeçalhos brutos de consulta http _ _ CRLF constante, 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 a _ consulta http _ personalizada

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

  1. Aloque um buffer que seja grande o suficiente para conter o nome da cadeia de caracteres do cabeçalho HTTP.
  2. Grave o nome da cadeia de caracteres do cabeçalho HTTP no buffer.
  3. Chame HttpQueryInfo com a _ consulta http _ personalizada, o buffer que contém o nome da cadeia de caracteres do cabeçalho HTTP e a variável que mantém o tamanho do buffer. Além disso, se seu aplicativo precisar dos dados em um formato específico, você poderá adicionar uma constante da lista de modificadores .
  4. Se a chamada para HttpQueryInfo falhar e GetLastError retornar um erro de _ buffer insuficiente _ , realoque um buffer com o número de bytes necessário.
  5. Grave o nome da cadeia de caracteres do cabeçalho HTTP no buffer novamente.
  6. Repita a chamada para HttpQueryInfo.

O exemplo a seguir demonstra uma chamada para HttpQueryInfo usando a _ constante personalizada de consulta http _ para solicitar o cabeçalho HTTP do tipo de 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 oferece suporte a implementações de servidor. Além disso, ele não deve ser usado de um serviço. Para implementações de servidor ou serviços, use o Microsoft Windows http Services (WinHTTP).