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 do cabeçalho:
- Use uma das Query Info Flag constantes 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.
Usar a constante associada ao cabeçalho HTTP de que seu aplicativo precisa é mais rápido internamente, mas pode haver cabeçalhos HTTP que não tenham uma constante associada a eles. Para esses casos, o método usando o sinalizador de atributo HTTP_QUERY_CUSTOM está disponível.
Ambos os métodos usam a função HttpQueryInfo. HttpQueryInfo utiliza o identificador HINTERNET sobre o qual a solicitação HTTP foi realizada, 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 que 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, execute estas etapas:
- 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 a sua aplicação precisar dos dados em um formato específico, pode adicionar uma constante da lista de Modificadores .
- Se o cabeçalho HTTP solicitado existir, a chamada para HttpQueryInfo deve falhar, GetLastError deve retornar ERROR_INSUFFICIENT_BUFFER e a variável passada para o parâmetro lpdwBufferLength deve ser definida como o número de bytes necessários.
- Aloque um buffer com o número de bytes necessários.
- 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 o HTTP_QUERY_CUSTOM
Para usar a funçãoHttpQueryInfopara recuperar um cabeçalho HTTP usando HTTP_QUERY_CUSTOM, execute estas etapas:
- Aloque um buffer grande o suficiente para conter o nome da cadeia de caracteres do cabeçalho HTTP.
- Escreva o nome da cadeia de caracteres do cabeçalho HTTP no buffer.
- 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 a sua aplicação precisar dos dados num formato específico, poderá adicionar uma constante da lista Modificadores.
- Se a chamada para HttpQueryInfo falhar e GetLastError retornar ERROR_INSUFFICIENT_BUFFER, realoque um buffer com o número de bytes necessários.
- Escreva o nome da cadeia de caracteres do cabeçalho HTTP no buffer novamente.
- 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 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;
}
Observação
WinINet não suporta implementações de servidor. Além disso, não deve ser usado a partir de um serviço. Para implementações ou serviços de servidor, use Microsoft Windows HTTP Services (WinHTTP).