используя wininet в C ++ - PullRequest
       5

используя wininet в C ++

2 голосов
/ 11 апреля 2011

У меня есть сервер, который, если я отправлю его, "https://MyDomain/Dir1/Dir2/login.html?u=1234&t=5678" ответит документом xml. Кто-нибудь знает, как я могу это сделать в wininet?

Вот что я сделал до сих пор:

std::string GetLoginData(void)
{
    HINTERNET hInternet, hConnection, hRequest;
    std::string retVal;

    hInternet = InternetOpen(L"My Application", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
    if(NULL != hInternet)
    {
        hConnection = InternetConnect(hInternet, L"MyDomain", INTERNET_DEFAULT_HTTPS_PORT, L"", L"", INTERNET_SERVICE_HTTP, 0, NULL);
        if(NULL != hConnection)
        {
            const wchar_t* lplpszAcceptTypes[] = {L"text/xml", L"application/xml", L"application/xhtml+xml", NULL};

            hRequest = HttpOpenRequest(hConnection, L"GET", L"Dir1/Dir2/Login.html", NULL, NULL, lplpszAcceptTypes,
                INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_IGNORE_CERT_CN_INVALID | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
                INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP | INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_KEEP_CONNECTION |
                INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_UI | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
            if(NULL != hRequest)
            {
                const char Params[] = {"u=1234&t=5678"};

                BOOL rc = HttpSendRequest(hRequest, NULL, 0, (void*)Params, strlen(Params));

                if(rc) // here rc = 0 and GetLastError() returns 12152
                {
                    DWORD availDataLen;
                    char Buff[4096];
                    DWORD readCount = ERROR_INTERNET_CONNECTION_RESET;

                    InternetQueryDataAvailable(hInternet, &availDataLen, 0, 0);
                    while(0 < availDataLen)
                    {
                        InternetReadFile(hInternet, Buff, min(sizeof(Buff), availDataLen), &readCount);
                        availDataLen -= readCount;
                        retVal = retVal + Buff;
                    }
                }
                InternetCloseHandle(hRequest);
            }
            InternetCloseHandle(hConnection);
        }
        InternetCloseHandle(hInternet);
    }
    return retVal;
}

но как видно из кода HttpSendRequest() не получается и GetLastError() возвращает 12152

Заранее спасибо Сэм

Ответы [ 2 ]

4 голосов
/ 11 апреля 2011

Это ERROR_WINHTTP_INVALID_SERVER_RESPONSE.Вероятно, вы делаете HTTP-запрос на порт HTTPS.

Я не очень хорошо знаю API, но похоже, что вам нужно добавить INTERNET_FLAG_SECURE к вашему вызову HttpOpenRequest и/ или в параметре flags вашего InternetConnect вызова также:

INTERNET_FLAG_SECURE
Используется семантика защищенных транзакций.Это означает использование технологии Secure Sockets Layer / Private Communications (SSL / PCT) и имеет смысл только в HTTP-запросах.Этот флаг используется HttpOpenRequest и InternetOpenUrl, но он избыточен, если в URL-адресе отображается https: //. Функция InternetConnect использует этот флаг для соединений HTTP;все дескрипторы запросов, созданные в этом соединении, наследуют этот флаг.

1 голос
/ 21 июля 2018

Добавление INTERNET_FLAG_SECURE к HttpOpenRequest сработало для меня.

HINTERNET hHttpRequest = HttpOpenRequest(hHttpSession, lpszVerb, lpszObjectName, 0, 0, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...