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;
}