in iothub_service_client/src/iothub_devicetwin.c [158:284]
static IOTHUB_DEVICE_TWIN_RESULT sendHttpRequestTwin(IOTHUB_SERVICE_CLIENT_DEVICE_TWIN_HANDLE serviceClientDeviceTwinHandle, IOTHUB_TWIN_REQUEST_MODE iotHubTwinRequestMode, const char* deviceName, const char* moduleId, BUFFER_HANDLE deviceJsonBuffer, BUFFER_HANDLE responseBuffer)
{
IOTHUB_DEVICE_TWIN_RESULT result;
STRING_HANDLE uriResource = NULL;
STRING_HANDLE accessKey = NULL;
STRING_HANDLE keyName = NULL;
HTTPAPIEX_SAS_HANDLE httpExApiSasHandle;
HTTPAPIEX_HANDLE httpExApiHandle;
HTTP_HEADERS_HANDLE httpHeader;
if ((uriResource = STRING_construct(serviceClientDeviceTwinHandle->hostname)) == NULL)
{
LogError("STRING_construct failed for uriResource");
result = IOTHUB_DEVICE_TWIN_ERROR;
}
else if ((accessKey = STRING_construct(serviceClientDeviceTwinHandle->sharedAccessKey)) == NULL)
{
LogError("STRING_construct failed for accessKey");
STRING_delete(uriResource);
result = IOTHUB_DEVICE_TWIN_ERROR;
}
else if ((keyName = STRING_construct(serviceClientDeviceTwinHandle->keyName)) == NULL)
{
LogError("STRING_construct failed for keyName");
STRING_delete(accessKey);
STRING_delete(uriResource);
result = IOTHUB_DEVICE_TWIN_ERROR;
}
else if ((httpHeader = createHttpHeader(iotHubTwinRequestMode)) == NULL)
{
LogError("HttpHeader creation failed");
STRING_delete(keyName);
STRING_delete(accessKey);
STRING_delete(uriResource);
result = IOTHUB_DEVICE_TWIN_ERROR;
}
else if ((httpExApiSasHandle = HTTPAPIEX_SAS_Create(accessKey, uriResource, keyName)) == NULL)
{
LogError("HTTPAPIEX_SAS_Create failed");
HTTPHeaders_Free(httpHeader);
STRING_delete(keyName);
STRING_delete(accessKey);
STRING_delete(uriResource);
result = IOTHUB_DEVICE_TWIN_HTTPAPI_ERROR;
}
else if ((httpExApiHandle = HTTPAPIEX_Create(serviceClientDeviceTwinHandle->hostname)) == NULL)
{
LogError("HTTPAPIEX_Create failed");
HTTPAPIEX_SAS_Destroy(httpExApiSasHandle);
HTTPHeaders_Free(httpHeader);
STRING_delete(keyName);
STRING_delete(accessKey);
STRING_delete(uriResource);
result = IOTHUB_DEVICE_TWIN_HTTPAPI_ERROR;
}
else
{
HTTPAPI_REQUEST_TYPE httpApiRequestType = HTTPAPI_REQUEST_GET;
STRING_HANDLE relativePath;
unsigned int statusCode = 0;
unsigned char is_error = 0;
//IOTHUB_TWIN_REQUEST_GET GET {iot hub}/twins/{device id} // Get device twin
//IOTHUB_TWIN_REQUEST_UPDATE PATCH {iot hub}/twins/{device id} // Partally update device twin
//IOTHUB_TWIN_REQUEST_REPLACE_TAGS PUT {iot hub}/twins/{device id}/tags // Replace update tags
//IOTHUB_TWIN_REQUEST_REPLACE_DESIRED PUT {iot hub}/twins/{device id}/properties/desired // Replace update desired properties
//IOTHUB_TWIN_REQUEST_UPDATE_DESIRED PATCH {iot hub}/twins/{device id}/properties/desired // Partially update desired properties
if ((iotHubTwinRequestMode == IOTHUB_TWIN_REQUEST_REPLACE_TAGS) || (iotHubTwinRequestMode == IOTHUB_TWIN_REQUEST_REPLACE_DESIRED))
{
httpApiRequestType = HTTPAPI_REQUEST_PUT;
}
else if ((iotHubTwinRequestMode == IOTHUB_TWIN_REQUEST_UPDATE) || (iotHubTwinRequestMode == IOTHUB_TWIN_REQUEST_UPDATE_DESIRED))
{
httpApiRequestType = HTTPAPI_REQUEST_PATCH;
}
else if (iotHubTwinRequestMode == IOTHUB_TWIN_REQUEST_GET)
{
httpApiRequestType = HTTPAPI_REQUEST_GET;
}
else
{
is_error = 1;
}
if (is_error)
{
LogError("Invalid request type");
result = IOTHUB_DEVICE_TWIN_HTTPAPI_ERROR;
}
else
{
if ((relativePath = createRelativePath(iotHubTwinRequestMode, deviceName, moduleId)) == NULL)
{
LogError("Failure creating relative path");
result = IOTHUB_DEVICE_TWIN_ERROR;
}
else if (HTTPAPIEX_SAS_ExecuteRequest(httpExApiSasHandle, httpExApiHandle, httpApiRequestType, STRING_c_str(relativePath), httpHeader, deviceJsonBuffer, &statusCode, NULL, responseBuffer) != HTTPAPIEX_OK)
{
LogError("HTTPAPIEX_SAS_ExecuteRequest failed");
STRING_delete(relativePath);
result = IOTHUB_DEVICE_TWIN_HTTPAPI_ERROR;
}
else
{
STRING_delete(relativePath);
if (statusCode == 200)
{
result = IOTHUB_DEVICE_TWIN_OK;
}
else
{
LogError("Http Failure status code %d.", statusCode);
result = IOTHUB_DEVICE_TWIN_ERROR;
}
}
}
HTTPAPIEX_Destroy(httpExApiHandle);
HTTPAPIEX_SAS_Destroy(httpExApiSasHandle);
HTTPHeaders_Free(httpHeader);
STRING_delete(keyName);
STRING_delete(accessKey);
STRING_delete(uriResource);
}
return result;
}