HTTPAPI_RESULT HTTPAPI_ExecuteRequest()

in adapters/httpapi_winhttp.c [911:979]


HTTPAPI_RESULT HTTPAPI_ExecuteRequest(HTTP_HANDLE handle, HTTPAPI_REQUEST_TYPE requestType, const char* relativePath,
    HTTP_HEADERS_HANDLE httpHeadersHandle, const unsigned char* content,
    size_t contentLength, unsigned int* statusCode,
    HTTP_HEADERS_HANDLE responseHeadersHandle, BUFFER_HANDLE responseContent)
{
    HTTPAPI_RESULT result;

    if (g_HTTPAPIState != HTTPAPI_INITIALIZED)
    {
        LogError("g_HTTPAPIState not HTTPAPI_INITIALIZED");
        result = HTTPAPI_NOT_INIT;
    }
    else if ((handle == NULL) ||
            (relativePath == NULL) ||
            (httpHeadersHandle == NULL))
    {
        result = HTTPAPI_INVALID_ARG;
        LogError("NULL parameter detected (result = %" PRI_MU_ENUM ")", MU_ENUM_VALUE(HTTPAPI_RESULT, result));
    }
    else
    {
        HTTP_HANDLE_DATA* handleData = (HTTP_HANDLE_DATA*)handle;
        wchar_t* httpHeaders = NULL;
        HINTERNET requestHandle = NULL;

        if ((result = InitiateWinhttpRequest(handleData, requestType, relativePath, &requestHandle)) != HTTPAPI_OK)
        {
            LogError("Cannot create Winhttp request handle");
        }
        else if ((result = SetProxyIfNecessary(handleData, requestHandle)) != HTTPAPI_OK)
        {
            LogError("unable to set proxy");
        }
        else if ((result = ConstructHeadersString(httpHeadersHandle, &httpHeaders)) != HTTPAPI_OK)
        {
            LogError("Cannot construct http headers");
        }
        else if ((result = SendHttpRequest(handleData, requestHandle, content, contentLength, httpHeaders)) != HTTPAPI_OK)
        {
            LogError("Cannot set options / send http request");
        }
        else if ((result = ReceiveResponseAndStatusCode(requestHandle, statusCode)) != HTTPAPI_OK)
        {
            LogError("failed receiving response and/or headers");
        }
        else if ((responseContent != NULL) && ((result = ReceiveResponseContent(requestHandle, responseContent)) != HTTPAPI_OK))
        {
            LogError("failed to receive response content");
        }
        else if ((responseHeadersHandle != NULL) && ((result = ReceiveResponseHeaders(requestHandle, responseHeadersHandle)) != HTTPAPI_OK))
        {
            LogError("Unable to retrieve http response headers");
        }
        else
        {
            result = HTTPAPI_OK;
        }

        if ((requestHandle != NULL) && (handleData->handleClosedOnCallbackError == false))
        {
            (void)WinHttpCloseHandle(requestHandle);
        }
        handleData->handleClosedOnCallbackError = false;

        free(httpHeaders);
    }

    return result;
}