HttpQueryInfo возвращает FALSE
Код:
HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwDataSize, &dwLengthDataSize, NULL)
Цитата: leich
Привет. Хочу узнать длину контента в ответе. Когда запрос идет на локальный сервер, то все нормально и длина выводится правильно. Как только идет запрос уже к внешнему сайту , то HttpQueryInfo возвращает FALSE (GetLastError() возвращает 2f76 - х.з. откуда), хотя потом InternetReadFile без проблем забирает контент и все правильно. Что это за глюк и как можно теперь узнать длину контента в ответе?
Код:
HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &dwDataSize, &dwLengthDataSize, NULL)
А ты уверен, что сервер обязан выдавать тебе длину контента?
У меня тоже не всегда получается.
На всякий случай:
Код:
// 1
DWORD TIEHttp::GetDataSize ()
{
if (FRequest) {
DWORD dwDataSize = 0;
DWORD dwLengthDataSize = sizeof(dwDataSize);
BOOL bQuery = ::HttpQueryInfo(
FRequest,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&dwDataSize,
&dwLengthDataSize,
NULL);
return bQuery? dwDataSize: 0;
}
return 0;
}
// 2
LPSTR TIEHttp::HeaderField(LPSTR lpszHeaderField)
{
//TODO: Add your source code here
SetStrBuffer(m_lpszResponseHeaderField, NULL);
DWORD dwSize = 20;
m_lpszResponseHeaderField = new char[dwSize];
wsprintf(m_lpszResponseHeaderField, "%s", lpszHeaderField);
retry:
if(!::HttpQueryInfo(FRequest, HTTP_QUERY_CUSTOM,
(LPVOID)m_lpszResponseHeaderField, &dwSize, NULL))
{
if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
{
// Code to handle the case where the header isn't available.
m_lpszResponseHeaderField = NULL;
}
else
{
// Check for an insufficient buffer.
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
m_lpszResponseHeaderField = new char[dwSize];
// Rewrite the header name in the buffer.
wsprintf(m_lpszResponseHeaderField, "%s", lpszHeaderField);
// Retry the call.
goto retry;
}
else
{
// Error handling code.
m_lpszResponseHeaderField = NULL;
}
}
}
return m_lpszResponseHeaderField;
}
// use 2
TIEHttp ht;
String Header = ht.HeaderField("Content-Type");
DWORD TIEHttp::GetDataSize ()
{
if (FRequest) {
DWORD dwDataSize = 0;
DWORD dwLengthDataSize = sizeof(dwDataSize);
BOOL bQuery = ::HttpQueryInfo(
FRequest,
HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
&dwDataSize,
&dwLengthDataSize,
NULL);
return bQuery? dwDataSize: 0;
}
return 0;
}
// 2
LPSTR TIEHttp::HeaderField(LPSTR lpszHeaderField)
{
//TODO: Add your source code here
SetStrBuffer(m_lpszResponseHeaderField, NULL);
DWORD dwSize = 20;
m_lpszResponseHeaderField = new char[dwSize];
wsprintf(m_lpszResponseHeaderField, "%s", lpszHeaderField);
retry:
if(!::HttpQueryInfo(FRequest, HTTP_QUERY_CUSTOM,
(LPVOID)m_lpszResponseHeaderField, &dwSize, NULL))
{
if (GetLastError()==ERROR_HTTP_HEADER_NOT_FOUND)
{
// Code to handle the case where the header isn't available.
m_lpszResponseHeaderField = NULL;
}
else
{
// Check for an insufficient buffer.
if (GetLastError()==ERROR_INSUFFICIENT_BUFFER)
{
// Allocate the necessary buffer.
m_lpszResponseHeaderField = new char[dwSize];
// Rewrite the header name in the buffer.
wsprintf(m_lpszResponseHeaderField, "%s", lpszHeaderField);
// Retry the call.
goto retry;
}
else
{
// Error handling code.
m_lpszResponseHeaderField = NULL;
}
}
}
return m_lpszResponseHeaderField;
}
// use 2
TIEHttp ht;
String Header = ht.HeaderField("Content-Type");
Цитата:
А ты уверен, что сервер обязан выдавать тебе длину контента?
. Да конечно. Это ж обыкновенное поле Content-length. Если его в ответе нет - значит скорее всего ошибся разработчик сервера. Да и те сервера, для которых HttpQueryInfo глючит это поле присылают.
Использую первый метод для получения размера
FRequest !=0 но функция возвращает false, a
GetLastError() возвращает 12150 - ERROR_HTTP_HEADER_NOT_FOUND.
Что может быть не правильно?