Как получить данные с WinHttpSendRequest от localhost - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь получить некоторые данные, используя параметр GET. Когда я пытаюсь получить данные с веб-адреса, он работает нормально. Просто я изменил веб-сервер на localhost, я не буду получать данные и получаю ОШИБКУ 12175

Что мне нужно изменить, чтобы мой код работал для веб-соединения И для тестирования на локальном хосте?

Когда я наберу адрес localhost в своем браузере, я получу ожидаемый результат.

LPCWSTR server = L"www.airfieldmanager-game.de";    //this works fine
//LPCWSTR server = L"localhost";    //causes Error 12175 at WinHttpSendRequest. Variables hSession, hConnect and cRequest looks fine.
LPCWSTR serverRequest = L"/php/TestCURL.php?data=1&param=Gesendete Daten!";

// Use WinHttpOpen to obtain a session handle.
hSession = WinHttpOpen(L"WinHTTP Example/1.0",
    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
    WINHTTP_NO_PROXY_NAME,
    WINHTTP_NO_PROXY_BYPASS, 0);

// Specify an HTTP server.
if (hSession)
    hConnect = WinHttpConnect(hSession, server,
    INTERNET_DEFAULT_HTTP_PORT, 0);

// Create an HTTP request handle.
if (hConnect)
    hRequest = WinHttpOpenRequest(hConnect, L"GET", serverRequest,
    NULL, WINHTTP_NO_REFERER,
    WINHTTP_DEFAULT_ACCEPT_TYPES,
    WINHTTP_FLAG_SECURE);

// Send a request.
if (hRequest)
    bResults = WinHttpSendRequest(hRequest,
    WINHTTP_NO_ADDITIONAL_HEADERS, 0,
    WINHTTP_NO_REQUEST_DATA, 0,
    0, 0);


// End the request.
if (bResults)
    bResults = WinHttpReceiveResponse(hRequest, NULL);

if (!bResults)
{
    int i = GetLastError();    //when using loscalhost i becomes 12175
}

1 Ответ

0 голосов
/ 19 января 2019

ошибка 12175 это ERROR_WINHTTP_SECURE_FAILURE.WinHttpSendRequest объясняет, когда возникает эта ошибка и как получить дополнительную информацию о ней:

Одна или несколько ошибок были обнаружены в Secure Sockets Layer (SSL) сертификат отправлен сервером.Чтобы определить тип ошибки, проверьте с помощью уведомления WINHTTP_CALLBACK_STATUS_SECURE_FAILURE в функции обратного вызова состояния.

, поэтому для диагностики отладки, как минимум, вам нужно написать self cb:

void CALLBACK WinHttpStatusCB(
                                      __in  HINTERNET hInternet,
                                      __in  DWORD_PTR dwContext,
                                      __in  DWORD dwInternetStatus,
                                      __in  LPVOID lpvStatusInformation,
                                      __in  DWORD dwStatusInformationLength
                                      )
{
    switch (dwInternetStatus)
    {
    case WINHTTP_CALLBACK_STATUS_SECURE_FAILURE:
        if (lpvStatusInformation && dwStatusInformationLength == sizeof(ULONG))
        {
            DbgPrint("SECURE_FAILURE:[%x]\n", *(PULONG)lpvStatusInformation);
            // ...
        }
        break;
    //...
    }
}

и активируйте его:

WinHttpSetStatusCallback(hSession, WinHttpStatusCB, WINHTTP_CALLBACK_FLAG_ALL_NOTIFICATIONS, 0);

или

WinHttpSetStatusCallback(hSession, WinHttpStatusCB, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, 0);

, при этом вы можете точно указать причину сбоя - несколько WINHTTP_CALLBACK_STATUS_FLAG_* флагов.

Если аргумент dwInternetStatus равен WINHTTP_CALLBACK_STATUS_SECURE_FAILURE, то lpvStatusInformation указывает на DWORD, который является побитовой комбинацией ИЛИ одного или нескольких из следующих значений.прочитайте подробнее

однако и из общего представления мы можем понять - CN в сертификате, который использует сервер, должен совпадать с именем DNS сайта, используемым в запросе.если вы используете localhost здесь - тогда CN-имя сертификата сервера должно быть также локальным хостом, или вы получили как минимум WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID:

общее имя SSL-сертификата (поле имени хоста)неверно, например, если вы ввели localhost , а общее имя в сертификате говорит heilpraxis-einssein.de .

для не полученных таких ошибокВы можете использовать WinHttpSetOption с WINHTTP_OPTION_SECURITY_FLAGS.вам нужно подумать, как минимальный набор SECURITY_FLAG_IGNORE_CERT_CN_INVALID

допускает недопустимое общее имя в сертификате;то есть имя сервера, указанное приложением, не совпадает с общим именем в сертификате.Если этот флаг установлен, приложение не получает обратный вызов WINHTTP_CALLBACK_STATUS_FLAG_CERT_CN_INVALID.

, но может установить несколько флагов:

            ULONG flags = 
                SECURITY_FLAG_IGNORE_UNKNOWN_CA|
                SECURITY_FLAG_IGNORE_CERT_DATE_INVALID|
                SECURITY_FLAG_IGNORE_CERT_CN_INVALID|
                SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;

            WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &flags, sizeof(flags));
...