WinInet HttpQuery Info возвращает неверные коды состояния - PullRequest
3 голосов
/ 21 июля 2011

Я работаю над программой, которая должна проверять существование страницы перед загрузкой (так что ничего особенного).

Все работает нормально, но я не могу заставить HttpQueryInfo вернуть действительный код состояния для страницы.Возвращенный код состояния: 1875378224

Код, вызывающий проблему:

DWORD headerBuffSize = sizeof(DWORD);
DWORD statusCode;
//Check existance of page (for 404 error)
if(!HttpQueryInfo(hRequestHandle,
                  HTTP_QUERY_STATUS_CODE,
                  &statusCode,
                  &headerBuffSize,
                  NULL))
    return 4;

if(statusCode == HTTP_STATUS_NOT_FOUND)
    cout << "We got a 404 error" << endl;

cout << "Got Status code: " << statusCode << endl; //1875378224 everywhere
cout << "404 status code: " << HTTP_STATUS_NOT_FOUND << endl; //What it should be getting

Я не уверен, что с этим делать;Я сравнил свой собственный код с несколькими примерами в Интернете, и похоже, что должен работать, хотя, возможно, я только что сделал глупую ошибку.

Спасибо!

Ответы [ 3 ]

10 голосов
/ 06 сентября 2012

Документация Microsoft для HttpQueryInfo подсказывает, что вы можете получить DWORD для HTTP_QUERY_STATUS_CODE при условии использования HTTP_QUERY_FLAG_NUMBER. Следующий фрагмент кода показывает, как:

DWORD statusCode = 0;
DWORD length = sizeof(DWORD);
HttpQueryInfo(
    hRequestHandle,
    HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
    &statusCode,
    &length,
    NULL
);
6 голосов
/ 21 июля 2011

Информация, полученная из заголовка ответа с помощью HttpQueryInfo, всегда является текстовой строкой.

int statusCode;
char responseText[256]; // change to wchar_t for unicode
DWORD responseTextSize = sizeof(responseText);

//Check existance of page (for 404 error)
if(!HttpQueryInfo(hRequestHandle,
                  HTTP_QUERY_STATUS_CODE,
                  &responseText,
                  &responseTextSize,
                  NULL))
    return 4;
statusCode = atoi(responseText);
1 голос
/ 18 октября 2011

Я только недавно заставил это работать - обнаружил, что большинство примеров в Интернете не работает для меня, даже те, что на MSDN (возможно, так как мой c ++ очень ржавый в настоящее время, и я делал простые ошибки).Вот что у меня работает, что у меня работает:

LPVOID lpOutBuffer = NULL;
DWORD dwSize = 0;

while (!HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE, (LPVOID)lpOutBuffer, &dwSize, NULL))    
{
    DWORD dwError = GetLastError();
    if (dwError == ERROR_INSUFFICIENT_BUFFER)
    {
        lpOutBuffer = new wchar_t[dwSize];  
    }
    else
    {
        fprintf(stderr, "HttpQueryInfo failed, error = %d (0x%x)\n",
            GetLastError(), GetLastError());
        break;
    }
}

wchar_t* outBuffer = (wchar_t*)lpOutBuffer;
std::wcout << L"Status_Code: " << outBuffer;

int status_code = _wtoi(outBuffer);

delete[] lpOutBuffer;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...