corrected version (with typedef struct IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE;) included in the sources

Dependents:   STM32F746_iothub_client_sample_mqtt

Fork of iothub_client by Azure IoT

Committer:
DieterGraef
Date:
Sun Jun 19 20:50:15 2016 +0000
Revision:
44:126f118a71ba
Parent:
42:448eecc3676e
got compiling errors when typedef struct IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE; was not included in the sources

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AzureIoTClient 42:448eecc3676e 1 // Copyright (c) Microsoft. All rights reserved.
AzureIoTClient 42:448eecc3676e 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
AzureIoTClient 42:448eecc3676e 3
AzureIoTClient 42:448eecc3676e 4 #include <stdlib.h>
AzureIoTClient 42:448eecc3676e 5 #ifdef _CRTDBG_MAP_ALLOC
AzureIoTClient 42:448eecc3676e 6 #include <crtdbg.h>
AzureIoTClient 42:448eecc3676e 7 #endif
AzureIoTClient 42:448eecc3676e 8 #include <string.h>
AzureIoTClient 42:448eecc3676e 9 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 42:448eecc3676e 10 #include "azure_c_shared_utility/string_tokenizer.h"
AzureIoTClient 42:448eecc3676e 11 #include "azure_c_shared_utility/doublylinkedlist.h"
AzureIoTClient 42:448eecc3676e 12 #include "azure_c_shared_utility/iot_logging.h"
AzureIoTClient 42:448eecc3676e 13 #include "azure_c_shared_utility/tickcounter.h"
AzureIoTClient 42:448eecc3676e 14 #include "azure_c_shared_utility/httpapiexsas.h"
AzureIoTClient 42:448eecc3676e 15
AzureIoTClient 42:448eecc3676e 16 #include "iothub_client_ll.h"
AzureIoTClient 42:448eecc3676e 17 #include "iothub_client_private.h"
AzureIoTClient 42:448eecc3676e 18 #include "iothub_client_version.h"
AzureIoTClient 42:448eecc3676e 19 #include "iothub_transport_ll.h"
AzureIoTClient 42:448eecc3676e 20 #include "parson.h"
AzureIoTClient 42:448eecc3676e 21 #include "iothub_client_ll_uploadtoblob.h"
AzureIoTClient 42:448eecc3676e 22 #include "blob.h"
AzureIoTClient 42:448eecc3676e 23
DieterGraef 44:126f118a71ba 24
DieterGraef 44:126f118a71ba 25
AzureIoTClient 42:448eecc3676e 26 /*Codes_SRS_IOTHUBCLIENT_LL_02_085: [ IoTHubClient_LL_UploadToBlob shall use the same authorization as step 1. to prepare and perform a HTTP request with the following parameters: ]*/
AzureIoTClient 42:448eecc3676e 27 #define FILE_UPLOAD_FAILED_BODY "{ \"isSuccess\":false, \"statusCode\":-1,\"statusDescription\" : \"client not able to connect with the server\" }"
AzureIoTClient 42:448eecc3676e 28
AzureIoTClient 42:448eecc3676e 29 #define AUTHORIZATION_SCHEME_VALUES \
AzureIoTClient 42:448eecc3676e 30 DEVICE_KEY, \
AzureIoTClient 42:448eecc3676e 31 SAS_TOKEN
AzureIoTClient 42:448eecc3676e 32
AzureIoTClient 42:448eecc3676e 33 DEFINE_ENUM(AUTHORIZATION_SCHEME, AUTHORIZATION_SCHEME_VALUES);
AzureIoTClient 42:448eecc3676e 34
AzureIoTClient 42:448eecc3676e 35 typedef struct IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA_TAG
AzureIoTClient 42:448eecc3676e 36 {
AzureIoTClient 42:448eecc3676e 37 STRING_HANDLE deviceId; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 38 const char* hostname; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 39 AUTHORIZATION_SCHEME authorizationScheme; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 40 union {
AzureIoTClient 42:448eecc3676e 41 STRING_HANDLE deviceKey; /*used when authorizationScheme is DEVICE_KEY*/
AzureIoTClient 42:448eecc3676e 42 STRING_HANDLE sas; /*used when authorizationScheme is SAS_TOKEN*/
AzureIoTClient 42:448eecc3676e 43 } credentials; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 44 }IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA;
AzureIoTClient 42:448eecc3676e 45
AzureIoTClient 42:448eecc3676e 46 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE IoTHubClient_LL_UploadToBlob_Create(const IOTHUB_CLIENT_CONFIG* config)
AzureIoTClient 42:448eecc3676e 47 {
AzureIoTClient 42:448eecc3676e 48 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = malloc(sizeof(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA));
AzureIoTClient 42:448eecc3676e 49 if (handleData == NULL)
AzureIoTClient 42:448eecc3676e 50 {
AzureIoTClient 42:448eecc3676e 51 LogError("oom - malloc");
AzureIoTClient 42:448eecc3676e 52 /*return as is*/
AzureIoTClient 42:448eecc3676e 53 }
AzureIoTClient 42:448eecc3676e 54 else
AzureIoTClient 42:448eecc3676e 55 {
AzureIoTClient 42:448eecc3676e 56 size_t iotHubNameLength = strlen(config->iotHubName);
AzureIoTClient 42:448eecc3676e 57 size_t iotHubSuffixLength = strlen(config->iotHubSuffix);
AzureIoTClient 42:448eecc3676e 58 handleData->deviceId = STRING_construct(config->deviceId);
AzureIoTClient 42:448eecc3676e 59 if (handleData->deviceId == NULL)
AzureIoTClient 42:448eecc3676e 60 {
AzureIoTClient 42:448eecc3676e 61 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 62 free(handleData);
AzureIoTClient 42:448eecc3676e 63 handleData = NULL;
AzureIoTClient 42:448eecc3676e 64 }
AzureIoTClient 42:448eecc3676e 65 else
AzureIoTClient 42:448eecc3676e 66 {
AzureIoTClient 42:448eecc3676e 67 handleData->hostname = malloc(iotHubNameLength + 1 + iotHubSuffixLength + 1); /*first +1 is because "." the second +1 is because \0*/
AzureIoTClient 42:448eecc3676e 68 if (handleData->hostname == NULL)
AzureIoTClient 42:448eecc3676e 69 {
AzureIoTClient 42:448eecc3676e 70 LogError("malloc failed");
AzureIoTClient 42:448eecc3676e 71 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 72 free(handleData);
AzureIoTClient 42:448eecc3676e 73 handleData = NULL;
AzureIoTClient 42:448eecc3676e 74 }
AzureIoTClient 42:448eecc3676e 75 else
AzureIoTClient 42:448eecc3676e 76 {
AzureIoTClient 42:448eecc3676e 77 memcpy((char*)handleData->hostname, config->iotHubName, iotHubNameLength);
AzureIoTClient 42:448eecc3676e 78 ((char*)handleData->hostname)[iotHubNameLength] = '.';
AzureIoTClient 42:448eecc3676e 79 memcpy((char*)handleData->hostname + iotHubNameLength + 1, config->iotHubSuffix, iotHubSuffixLength + 1); /*+1 will copy the \0 too*/
AzureIoTClient 42:448eecc3676e 80 if (config->deviceSasToken != NULL)
AzureIoTClient 42:448eecc3676e 81 {
AzureIoTClient 42:448eecc3676e 82 handleData->authorizationScheme = SAS_TOKEN;
AzureIoTClient 42:448eecc3676e 83 handleData->credentials.sas = STRING_construct(config->deviceSasToken);
AzureIoTClient 42:448eecc3676e 84 if (handleData->credentials.sas == NULL)
AzureIoTClient 42:448eecc3676e 85 {
AzureIoTClient 42:448eecc3676e 86 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 87 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 88 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 89 free(handleData);
AzureIoTClient 42:448eecc3676e 90 handleData = NULL;
AzureIoTClient 42:448eecc3676e 91 }
AzureIoTClient 42:448eecc3676e 92 else
AzureIoTClient 42:448eecc3676e 93 {
AzureIoTClient 42:448eecc3676e 94 /*return as is*/
AzureIoTClient 42:448eecc3676e 95 }
AzureIoTClient 42:448eecc3676e 96 }
AzureIoTClient 42:448eecc3676e 97 else
AzureIoTClient 42:448eecc3676e 98 {
AzureIoTClient 42:448eecc3676e 99 handleData->authorizationScheme = DEVICE_KEY;
AzureIoTClient 42:448eecc3676e 100 handleData->credentials.deviceKey = STRING_construct(config->deviceKey);
AzureIoTClient 42:448eecc3676e 101 if (handleData->credentials.deviceKey == NULL)
AzureIoTClient 42:448eecc3676e 102 {
AzureIoTClient 42:448eecc3676e 103 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 104 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 105 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 106 free(handleData);
AzureIoTClient 42:448eecc3676e 107 handleData = NULL;
AzureIoTClient 42:448eecc3676e 108 }
AzureIoTClient 42:448eecc3676e 109 else
AzureIoTClient 42:448eecc3676e 110 {
AzureIoTClient 42:448eecc3676e 111 /*return as is*/
AzureIoTClient 42:448eecc3676e 112 }
AzureIoTClient 42:448eecc3676e 113 }
AzureIoTClient 42:448eecc3676e 114 }
AzureIoTClient 42:448eecc3676e 115 }
AzureIoTClient 42:448eecc3676e 116 }
AzureIoTClient 42:448eecc3676e 117 return (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE)handleData;
DieterGraef 44:126f118a71ba 118
AzureIoTClient 42:448eecc3676e 119 }
AzureIoTClient 42:448eecc3676e 120
AzureIoTClient 42:448eecc3676e 121 /*returns 0 when correlationId, sasUri contain data*/
AzureIoTClient 42:448eecc3676e 122 static int IoTHubClient_LL_UploadToBlob_step1and2(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData, HTTPAPIEX_HANDLE iotHubHttpApiExHandle, HTTP_HEADERS_HANDLE requestHttpHeaders, const char* destinationFileName,
AzureIoTClient 42:448eecc3676e 123 STRING_HANDLE correlationId, STRING_HANDLE sasUri)
AzureIoTClient 42:448eecc3676e 124 {
AzureIoTClient 42:448eecc3676e 125 int result;
AzureIoTClient 42:448eecc3676e 126
AzureIoTClient 42:448eecc3676e 127 /*Codes_SRS_IOTHUBCLIENT_LL_02_066: [ IoTHubClient_LL_UploadToBlob shall create an HTTP relative path formed from "/devices/" + deviceId + "/files/" + destinationFileName + "?api-version=API_VERSION". ]*/
AzureIoTClient 42:448eecc3676e 128 STRING_HANDLE relativePath = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 129 if (relativePath == NULL)
AzureIoTClient 42:448eecc3676e 130 {
AzureIoTClient 42:448eecc3676e 131 /*Codes_SRS_IOTHUBCLIENT_LL_02_067: [ If creating the relativePath fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 132 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 133 result = __LINE__;
AzureIoTClient 42:448eecc3676e 134 }
AzureIoTClient 42:448eecc3676e 135 else
AzureIoTClient 42:448eecc3676e 136 {
AzureIoTClient 42:448eecc3676e 137 if (!(
AzureIoTClient 42:448eecc3676e 138 (STRING_concat_with_STRING(relativePath, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 139 (STRING_concat(relativePath, "/files/") == 0) &&
AzureIoTClient 42:448eecc3676e 140 (STRING_concat(relativePath, destinationFileName) == 0) &&
AzureIoTClient 42:448eecc3676e 141 (STRING_concat(relativePath, API_VERSION) == 0)
AzureIoTClient 42:448eecc3676e 142 ))
AzureIoTClient 42:448eecc3676e 143 {
AzureIoTClient 42:448eecc3676e 144 /*Codes_SRS_IOTHUBCLIENT_LL_02_067: [ If creating the relativePath fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 145 LogError("unable to concatenate STRING");
AzureIoTClient 42:448eecc3676e 146 result = __LINE__;
AzureIoTClient 42:448eecc3676e 147 }
AzureIoTClient 42:448eecc3676e 148 else
AzureIoTClient 42:448eecc3676e 149 {
AzureIoTClient 42:448eecc3676e 150 /*Codes_SRS_IOTHUBCLIENT_LL_02_068: [ IoTHubClient_LL_UploadToBlob shall create an HTTP responseContent BUFFER_HANDLE. ]*/
AzureIoTClient 42:448eecc3676e 151 BUFFER_HANDLE responseContent = BUFFER_new();
AzureIoTClient 42:448eecc3676e 152 if (responseContent == NULL)
AzureIoTClient 42:448eecc3676e 153 {
AzureIoTClient 42:448eecc3676e 154 /*Codes_SRS_IOTHUBCLIENT_LL_02_069: [ If creating the HTTP response buffer handle fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 155 result = __LINE__;
AzureIoTClient 42:448eecc3676e 156 LogError("unable to BUFFER_new");
AzureIoTClient 42:448eecc3676e 157 }
AzureIoTClient 42:448eecc3676e 158 else
AzureIoTClient 42:448eecc3676e 159 {
AzureIoTClient 42:448eecc3676e 160 /*Codes_SRS_IOTHUBCLIENT_LL_02_072: [ IoTHubClient_LL_UploadToBlob shall add the following name:value to request HTTP headers: ] "Content-Type": "application/json" "Accept": "application/json" "User-Agent": "iothubclient/" IOTHUB_SDK_VERSION*/
AzureIoTClient 42:448eecc3676e 161 if (!(
AzureIoTClient 42:448eecc3676e 162 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Content-Type", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 42:448eecc3676e 163 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Accept", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 42:448eecc3676e 164 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "User-Agent", "iothubclient/" IOTHUB_SDK_VERSION) == HTTP_HEADERS_OK) &&
AzureIoTClient 42:448eecc3676e 165 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Authorization", "") == HTTP_HEADERS_OK)
AzureIoTClient 42:448eecc3676e 166 ))
AzureIoTClient 42:448eecc3676e 167 {
AzureIoTClient 42:448eecc3676e 168 /*Codes_SRS_IOTHUBCLIENT_LL_02_071: [ If creating the HTTP headers fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 169 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 42:448eecc3676e 170 result = __LINE__;
AzureIoTClient 42:448eecc3676e 171 }
AzureIoTClient 42:448eecc3676e 172 else
AzureIoTClient 42:448eecc3676e 173 {
AzureIoTClient 42:448eecc3676e 174 int wasIoTHubRequestSuccess = 0; /*!=0 means responseContent has a buffer that should be parsed by parson after executing the below switch*/
AzureIoTClient 42:448eecc3676e 175 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 176 {
AzureIoTClient 42:448eecc3676e 177 default:
AzureIoTClient 42:448eecc3676e 178 {
AzureIoTClient 42:448eecc3676e 179 /*wasIoTHubRequestSuccess takes care of the return value*/
AzureIoTClient 42:448eecc3676e 180 LogError("Internal Error: unexpected value in handleData->authorizationScheme = %d", handleData->authorizationScheme);
AzureIoTClient 42:448eecc3676e 181 break;
AzureIoTClient 42:448eecc3676e 182 }
AzureIoTClient 42:448eecc3676e 183 case (SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 184 {
AzureIoTClient 42:448eecc3676e 185 const char* sasToken = STRING_c_str(handleData->credentials.sas);
AzureIoTClient 42:448eecc3676e 186 /*Codes_SRS_IOTHUBCLIENT_LL_02_073: [ If the credentials used to create handle have "sasToken" then IoTHubClient_LL_UploadToBlob shall add the following HTTP request headers: ]*/
AzureIoTClient 42:448eecc3676e 187 if (HTTPHeaders_ReplaceHeaderNameValuePair(requestHttpHeaders, "Authorization", sasToken) != HTTP_HEADERS_OK)
AzureIoTClient 42:448eecc3676e 188 {
AzureIoTClient 42:448eecc3676e 189 /*Codes_SRS_IOTHUBCLIENT_LL_02_074: [ If adding "Authorization" fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR ]*/
AzureIoTClient 42:448eecc3676e 190 result = __LINE__;
AzureIoTClient 42:448eecc3676e 191 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 42:448eecc3676e 192 }
AzureIoTClient 42:448eecc3676e 193 else
AzureIoTClient 42:448eecc3676e 194 {
AzureIoTClient 42:448eecc3676e 195 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 196 /*Codes_SRS_IOTHUBCLIENT_LL_02_075: [ IoTHubClient_LL_UploadToBlob shall execute HTTPAPIEX_ExecuteRequest passing the following information for arguments: ]*/
AzureIoTClient 42:448eecc3676e 197 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 198 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the handle created at the beginning of `IoTHubClient_LL_UploadToBlob`*/
AzureIoTClient 42:448eecc3676e 199 HTTPAPI_REQUEST_GET, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 200 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 201 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 202 NULL, /*BUFFER_HANDLE requestContent - NULL*/
AzureIoTClient 42:448eecc3676e 203 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 204 NULL, /*HTTP_HEADERS_HANDLE responseHttpHeadersHandl - NULL*/
AzureIoTClient 42:448eecc3676e 205 responseContent /*BUFFER_HANDLE responseContent - the HTTP response BUFFER_HANDLE - responseContent*/
AzureIoTClient 42:448eecc3676e 206 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 207 {
AzureIoTClient 42:448eecc3676e 208 /*Codes_SRS_IOTHUBCLIENT_LL_02_076: [ If HTTPAPIEX_ExecuteRequest call fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 209 result = __LINE__;
AzureIoTClient 42:448eecc3676e 210 LogError("unable to HTTPAPIEX_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 211 }
AzureIoTClient 42:448eecc3676e 212 else
AzureIoTClient 42:448eecc3676e 213 {
AzureIoTClient 42:448eecc3676e 214 /*Codes_SRS_IOTHUBCLIENT_LL_02_077: [ If HTTP statusCode is greater than or equal to 300 then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 215 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 216 {
AzureIoTClient 42:448eecc3676e 217 result = __LINE__;
AzureIoTClient 42:448eecc3676e 218 wasIoTHubRequestSuccess = 0;
AzureIoTClient 42:448eecc3676e 219 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 220 }
AzureIoTClient 42:448eecc3676e 221 else
AzureIoTClient 42:448eecc3676e 222 {
AzureIoTClient 42:448eecc3676e 223 wasIoTHubRequestSuccess = 1;
AzureIoTClient 42:448eecc3676e 224 }
AzureIoTClient 42:448eecc3676e 225 }
AzureIoTClient 42:448eecc3676e 226 }
AzureIoTClient 42:448eecc3676e 227 break;
AzureIoTClient 42:448eecc3676e 228 }
AzureIoTClient 42:448eecc3676e 229 case(DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 230 {
AzureIoTClient 42:448eecc3676e 231 /*Codes_SRS_IOTHUBCLIENT_LL_02_078: [ If the credentials used to create handle have "deviceKey" then IoTHubClient_LL_UploadToBlob shall create an HTTPAPIEX_SAS_HANDLE passing as arguments: ]*/
AzureIoTClient 42:448eecc3676e 232 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 42:448eecc3676e 233 if (uriResource == NULL)
AzureIoTClient 42:448eecc3676e 234 {
AzureIoTClient 42:448eecc3676e 235 /*Codes_SRS_IOTHUBCLIENT_LL_02_089: [ If creating the HTTPAPIEX_SAS_HANDLE fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 236 result = __LINE__;
AzureIoTClient 42:448eecc3676e 237 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 238 }
AzureIoTClient 42:448eecc3676e 239 else
AzureIoTClient 42:448eecc3676e 240 {
AzureIoTClient 42:448eecc3676e 241 if (!(
AzureIoTClient 42:448eecc3676e 242 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 42:448eecc3676e 243 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0)
AzureIoTClient 42:448eecc3676e 244 ))
AzureIoTClient 42:448eecc3676e 245 {
AzureIoTClient 42:448eecc3676e 246 /*Codes_SRS_IOTHUBCLIENT_LL_02_089: [ If creating the HTTPAPIEX_SAS_HANDLE fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 247 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 42:448eecc3676e 248 result = __LINE__;
AzureIoTClient 42:448eecc3676e 249 }
AzureIoTClient 42:448eecc3676e 250 else
AzureIoTClient 42:448eecc3676e 251 {
AzureIoTClient 42:448eecc3676e 252 STRING_HANDLE empty = STRING_new();
AzureIoTClient 42:448eecc3676e 253 if (empty == NULL)
AzureIoTClient 42:448eecc3676e 254 {
AzureIoTClient 42:448eecc3676e 255 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 256 result = __LINE__;
AzureIoTClient 42:448eecc3676e 257 }
AzureIoTClient 42:448eecc3676e 258 else
AzureIoTClient 42:448eecc3676e 259 {
AzureIoTClient 42:448eecc3676e 260 /*Codes_SRS_IOTHUBCLIENT_LL_02_089: [ If creating the HTTPAPIEX_SAS_HANDLE fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 261 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 42:448eecc3676e 262 if (sasHandle == NULL)
AzureIoTClient 42:448eecc3676e 263 {
AzureIoTClient 42:448eecc3676e 264 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 42:448eecc3676e 265 result = __LINE__;
AzureIoTClient 42:448eecc3676e 266 }
AzureIoTClient 42:448eecc3676e 267 else
AzureIoTClient 42:448eecc3676e 268 {
AzureIoTClient 42:448eecc3676e 269 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 270 /*Codes_SRS_IOTHUBCLIENT_LL_02_090: [ IoTHubClient_LL_UploadToBlob shall call HTTPAPIEX_SAS_ExecuteRequest passing as arguments: ]*/
AzureIoTClient 42:448eecc3676e 271 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 272 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 42:448eecc3676e 273 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 42:448eecc3676e 274 HTTPAPI_REQUEST_GET, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 275 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 276 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 277 NULL, /*BUFFER_HANDLE requestContent - NULL*/
AzureIoTClient 42:448eecc3676e 278 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 279 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 42:448eecc3676e 280 responseContent
AzureIoTClient 42:448eecc3676e 281 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 282 {
AzureIoTClient 42:448eecc3676e 283 /*Codes_SRS_IOTHUBCLIENT_LL_02_079: [ If HTTPAPIEX_SAS_ExecuteRequest fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 284 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 285 result = __LINE__;
AzureIoTClient 42:448eecc3676e 286 }
AzureIoTClient 42:448eecc3676e 287 else
AzureIoTClient 42:448eecc3676e 288 {
AzureIoTClient 42:448eecc3676e 289 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 290 {
AzureIoTClient 42:448eecc3676e 291 /*Codes_SRS_IOTHUBCLIENT_LL_02_080: [ If status code is greater than or equal to 300 then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 292 result = __LINE__;
AzureIoTClient 42:448eecc3676e 293 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 294 }
AzureIoTClient 42:448eecc3676e 295 else
AzureIoTClient 42:448eecc3676e 296 {
AzureIoTClient 42:448eecc3676e 297 wasIoTHubRequestSuccess = 1;
AzureIoTClient 42:448eecc3676e 298 }
AzureIoTClient 42:448eecc3676e 299 }
AzureIoTClient 42:448eecc3676e 300 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 42:448eecc3676e 301 }
AzureIoTClient 42:448eecc3676e 302 STRING_delete(empty);
AzureIoTClient 42:448eecc3676e 303 }
AzureIoTClient 42:448eecc3676e 304 }
AzureIoTClient 42:448eecc3676e 305 STRING_delete(uriResource);
AzureIoTClient 42:448eecc3676e 306 }
AzureIoTClient 42:448eecc3676e 307 }
AzureIoTClient 42:448eecc3676e 308 } /*switch*/
AzureIoTClient 42:448eecc3676e 309
AzureIoTClient 42:448eecc3676e 310 if (wasIoTHubRequestSuccess == 0)
AzureIoTClient 42:448eecc3676e 311 {
AzureIoTClient 42:448eecc3676e 312 /*do nothing, shall be reported as an error*/
AzureIoTClient 42:448eecc3676e 313 }
AzureIoTClient 42:448eecc3676e 314 else
AzureIoTClient 42:448eecc3676e 315 {
AzureIoTClient 42:448eecc3676e 316 const unsigned char*responseContent_u_char = BUFFER_u_char(responseContent);
AzureIoTClient 42:448eecc3676e 317 size_t responseContent_length = BUFFER_length(responseContent);
AzureIoTClient 42:448eecc3676e 318 STRING_HANDLE responseAsString = STRING_from_byte_array(responseContent_u_char, responseContent_length);
AzureIoTClient 42:448eecc3676e 319 if (responseAsString == NULL)
AzureIoTClient 42:448eecc3676e 320 {
AzureIoTClient 42:448eecc3676e 321 result = __LINE__;
AzureIoTClient 42:448eecc3676e 322 LogError("unable to get the response as string");
AzureIoTClient 42:448eecc3676e 323 }
AzureIoTClient 42:448eecc3676e 324 else
AzureIoTClient 42:448eecc3676e 325 {
AzureIoTClient 42:448eecc3676e 326 /*Codes_SRS_IOTHUBCLIENT_LL_02_081: [ Otherwise, IoTHubClient_LL_UploadToBlob shall use parson to extract and save the following information from the response buffer: correlationID and SasUri. ]*/
AzureIoTClient 42:448eecc3676e 327 JSON_Value* allJson = json_parse_string(STRING_c_str(responseAsString));
AzureIoTClient 42:448eecc3676e 328 if (allJson == NULL)
AzureIoTClient 42:448eecc3676e 329 {
AzureIoTClient 42:448eecc3676e 330 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 331 LogError("unable to json_parse_string");
AzureIoTClient 42:448eecc3676e 332 result = __LINE__;
AzureIoTClient 42:448eecc3676e 333 }
AzureIoTClient 42:448eecc3676e 334 else
AzureIoTClient 42:448eecc3676e 335 {
AzureIoTClient 42:448eecc3676e 336 JSON_Object* jsonObject = json_value_get_object(allJson);
AzureIoTClient 42:448eecc3676e 337 if (jsonObject == NULL)
AzureIoTClient 42:448eecc3676e 338 {
AzureIoTClient 42:448eecc3676e 339 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 340 LogError("unable to json_value_get_object");
AzureIoTClient 42:448eecc3676e 341 result = __LINE__;
AzureIoTClient 42:448eecc3676e 342 }
AzureIoTClient 42:448eecc3676e 343 else
AzureIoTClient 42:448eecc3676e 344 {
AzureIoTClient 42:448eecc3676e 345 const char* json_correlationId;
AzureIoTClient 42:448eecc3676e 346 json_correlationId = json_object_get_string(jsonObject, "correlationId");
AzureIoTClient 42:448eecc3676e 347 if (json_correlationId == NULL)
AzureIoTClient 42:448eecc3676e 348 {
AzureIoTClient 42:448eecc3676e 349 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 350 LogError("unable to json_object_get_string(jsonObject, \"correlationId\")");
AzureIoTClient 42:448eecc3676e 351 result = __LINE__;
AzureIoTClient 42:448eecc3676e 352 }
AzureIoTClient 42:448eecc3676e 353 else
AzureIoTClient 42:448eecc3676e 354 {
AzureIoTClient 42:448eecc3676e 355 if (STRING_copy(correlationId, json_correlationId) != 0)
AzureIoTClient 42:448eecc3676e 356 {
AzureIoTClient 42:448eecc3676e 357 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 358 LogError("unable to copy json_correlationId");
AzureIoTClient 42:448eecc3676e 359 result = __LINE__;
AzureIoTClient 42:448eecc3676e 360 }
AzureIoTClient 42:448eecc3676e 361 else
AzureIoTClient 42:448eecc3676e 362 {
AzureIoTClient 42:448eecc3676e 363 const char* json_hostName = json_object_get_string(jsonObject, "hostName");
AzureIoTClient 42:448eecc3676e 364 if (json_hostName == NULL)
AzureIoTClient 42:448eecc3676e 365 {
AzureIoTClient 42:448eecc3676e 366 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 367 LogError("unable to json_object_get_string(jsonObject, \"hostName\")");
AzureIoTClient 42:448eecc3676e 368 result = __LINE__;
AzureIoTClient 42:448eecc3676e 369 }
AzureIoTClient 42:448eecc3676e 370 else
AzureIoTClient 42:448eecc3676e 371 {
AzureIoTClient 42:448eecc3676e 372 const char* json_containerName = json_object_get_string(jsonObject, "containerName");
AzureIoTClient 42:448eecc3676e 373 if (json_containerName == NULL)
AzureIoTClient 42:448eecc3676e 374 {
AzureIoTClient 42:448eecc3676e 375 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 376 LogError("unable to json_object_get_string(jsonObject, \"containerName\")");
AzureIoTClient 42:448eecc3676e 377 result = __LINE__;
AzureIoTClient 42:448eecc3676e 378 }
AzureIoTClient 42:448eecc3676e 379 else
AzureIoTClient 42:448eecc3676e 380 {
AzureIoTClient 42:448eecc3676e 381 const char* json_blobName = json_object_get_string(jsonObject, "blobName");
AzureIoTClient 42:448eecc3676e 382 if (json_blobName == NULL)
AzureIoTClient 42:448eecc3676e 383 {
AzureIoTClient 42:448eecc3676e 384 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 385 LogError("unable to json_object_get_string(jsonObject, \"blobName\")");
AzureIoTClient 42:448eecc3676e 386 result = __LINE__;
AzureIoTClient 42:448eecc3676e 387 }
AzureIoTClient 42:448eecc3676e 388 else
AzureIoTClient 42:448eecc3676e 389 {
AzureIoTClient 42:448eecc3676e 390 const char* json_sasToken = json_object_get_string(jsonObject, "sasToken");
AzureIoTClient 42:448eecc3676e 391 if (json_sasToken == NULL)
AzureIoTClient 42:448eecc3676e 392 {
AzureIoTClient 42:448eecc3676e 393 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 394 LogError("unable to json_object_get_string(jsonObject, \"sasToken\")");
AzureIoTClient 42:448eecc3676e 395 result = __LINE__;
AzureIoTClient 42:448eecc3676e 396 }
AzureIoTClient 42:448eecc3676e 397 else
AzureIoTClient 42:448eecc3676e 398 {
AzureIoTClient 42:448eecc3676e 399 /*good JSON received from the service*/
AzureIoTClient 42:448eecc3676e 400
AzureIoTClient 42:448eecc3676e 401 if (STRING_copy(sasUri, "https://") != 0)
AzureIoTClient 42:448eecc3676e 402 {
AzureIoTClient 42:448eecc3676e 403 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 404 LogError("unable to STRING_copy");
AzureIoTClient 42:448eecc3676e 405 result = __LINE__;
AzureIoTClient 42:448eecc3676e 406 }
AzureIoTClient 42:448eecc3676e 407 else
AzureIoTClient 42:448eecc3676e 408 {
AzureIoTClient 42:448eecc3676e 409 if (!(
AzureIoTClient 42:448eecc3676e 410 (STRING_concat(sasUri, json_hostName) == 0) &&
AzureIoTClient 42:448eecc3676e 411 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 42:448eecc3676e 412 (STRING_concat(sasUri, json_containerName) == 0) &&
AzureIoTClient 42:448eecc3676e 413 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 42:448eecc3676e 414 (STRING_concat(sasUri, json_blobName) == 0) &&
AzureIoTClient 42:448eecc3676e 415 (STRING_concat(sasUri, json_sasToken) == 0)
AzureIoTClient 42:448eecc3676e 416 ))
AzureIoTClient 42:448eecc3676e 417 {
AzureIoTClient 42:448eecc3676e 418 /*Codes_SRS_IOTHUBCLIENT_LL_02_082: [ If extracting and saving the correlationId or SasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 419 LogError("unable to STRING_concat");
AzureIoTClient 42:448eecc3676e 420 result = __LINE__;
AzureIoTClient 42:448eecc3676e 421 }
AzureIoTClient 42:448eecc3676e 422 else
AzureIoTClient 42:448eecc3676e 423 {
AzureIoTClient 42:448eecc3676e 424 result = 0; /*success in step 1*/
AzureIoTClient 42:448eecc3676e 425 }
AzureIoTClient 42:448eecc3676e 426 }
AzureIoTClient 42:448eecc3676e 427 }
AzureIoTClient 42:448eecc3676e 428 }
AzureIoTClient 42:448eecc3676e 429 }
AzureIoTClient 42:448eecc3676e 430 }
AzureIoTClient 42:448eecc3676e 431 }
AzureIoTClient 42:448eecc3676e 432 }
AzureIoTClient 42:448eecc3676e 433 }
AzureIoTClient 42:448eecc3676e 434 json_value_free(allJson);
AzureIoTClient 42:448eecc3676e 435 }
AzureIoTClient 42:448eecc3676e 436 STRING_delete(responseAsString);
AzureIoTClient 42:448eecc3676e 437 }
AzureIoTClient 42:448eecc3676e 438 }
AzureIoTClient 42:448eecc3676e 439 }
AzureIoTClient 42:448eecc3676e 440 BUFFER_delete(responseContent);
AzureIoTClient 42:448eecc3676e 441 }
AzureIoTClient 42:448eecc3676e 442 }
AzureIoTClient 42:448eecc3676e 443 STRING_delete(relativePath);
AzureIoTClient 42:448eecc3676e 444 }
AzureIoTClient 42:448eecc3676e 445
AzureIoTClient 42:448eecc3676e 446 return result;
AzureIoTClient 42:448eecc3676e 447 }
AzureIoTClient 42:448eecc3676e 448
AzureIoTClient 42:448eecc3676e 449 /*returns 0 when the IoTHub has been informed about the file upload status*/
AzureIoTClient 42:448eecc3676e 450 static int IoTHubClient_LL_UploadToBlob_step3(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData, STRING_HANDLE correlationId, HTTPAPIEX_HANDLE iotHubHttpApiExHandle, HTTP_HEADERS_HANDLE requestHttpHeaders, BUFFER_HANDLE messageBody)
AzureIoTClient 42:448eecc3676e 451 {
AzureIoTClient 42:448eecc3676e 452 int result;
AzureIoTClient 42:448eecc3676e 453 /*here is step 3. depending on the outcome of step 2 it needs to inform IoTHub about the file upload status*/
AzureIoTClient 42:448eecc3676e 454 /*if step 1 failed, there's nothing that step 3 needs to report.*/
AzureIoTClient 42:448eecc3676e 455 /*this POST "tries" to happen*/
AzureIoTClient 42:448eecc3676e 456
AzureIoTClient 42:448eecc3676e 457 /*Codes_SRS_IOTHUBCLIENT_LL_02_085: [ IoTHubClient_LL_UploadToBlob shall use the same authorization as step 1. to prepare and perform a HTTP request with the following parameters: ]*/
AzureIoTClient 42:448eecc3676e 458 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 42:448eecc3676e 459 if (uriResource == NULL)
AzureIoTClient 42:448eecc3676e 460 {
AzureIoTClient 42:448eecc3676e 461 LogError("unable to construct URI");
AzureIoTClient 42:448eecc3676e 462 result = __LINE__;
AzureIoTClient 42:448eecc3676e 463 }
AzureIoTClient 42:448eecc3676e 464 else
AzureIoTClient 42:448eecc3676e 465 {
AzureIoTClient 42:448eecc3676e 466 if (!(
AzureIoTClient 42:448eecc3676e 467 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 42:448eecc3676e 468 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 469 (STRING_concat(uriResource, "/files/notifications") == 0)
AzureIoTClient 42:448eecc3676e 470 ))
AzureIoTClient 42:448eecc3676e 471 {
AzureIoTClient 42:448eecc3676e 472 LogError("unable to STRING_concat");
AzureIoTClient 42:448eecc3676e 473 result = __LINE__;
AzureIoTClient 42:448eecc3676e 474 }
AzureIoTClient 42:448eecc3676e 475 else
AzureIoTClient 42:448eecc3676e 476 {
AzureIoTClient 42:448eecc3676e 477 STRING_HANDLE relativePathNotification = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 478 if (relativePathNotification == NULL)
AzureIoTClient 42:448eecc3676e 479 {
AzureIoTClient 42:448eecc3676e 480 result = __LINE__;
AzureIoTClient 42:448eecc3676e 481 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 482 }
AzureIoTClient 42:448eecc3676e 483 else
AzureIoTClient 42:448eecc3676e 484 {
AzureIoTClient 42:448eecc3676e 485 if (!(
AzureIoTClient 42:448eecc3676e 486 (STRING_concat_with_STRING(relativePathNotification, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 487 (STRING_concat(relativePathNotification, "/files/notifications/") == 0) &&
AzureIoTClient 42:448eecc3676e 488 (STRING_concat(relativePathNotification, STRING_c_str(correlationId)) == 0) &&
AzureIoTClient 42:448eecc3676e 489 (STRING_concat(relativePathNotification, API_VERSION) == 0)
AzureIoTClient 42:448eecc3676e 490 ))
AzureIoTClient 42:448eecc3676e 491 {
AzureIoTClient 42:448eecc3676e 492 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 42:448eecc3676e 493 result = __LINE__;
AzureIoTClient 42:448eecc3676e 494 }
AzureIoTClient 42:448eecc3676e 495 else
AzureIoTClient 42:448eecc3676e 496 {
AzureIoTClient 42:448eecc3676e 497 /*Codes_SRS_IOTHUBCLIENT_LL_02_086: [ If performing the HTTP request fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 498 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 499 {
AzureIoTClient 42:448eecc3676e 500 default:
AzureIoTClient 42:448eecc3676e 501 {
AzureIoTClient 42:448eecc3676e 502 LogError("internal error: unknown authorization Scheme");
AzureIoTClient 42:448eecc3676e 503 result = __LINE__;
AzureIoTClient 42:448eecc3676e 504 break;
AzureIoTClient 42:448eecc3676e 505 }
AzureIoTClient 42:448eecc3676e 506 case (DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 507 {
AzureIoTClient 42:448eecc3676e 508 STRING_HANDLE empty = STRING_new();
AzureIoTClient 42:448eecc3676e 509 if (empty == NULL)
AzureIoTClient 42:448eecc3676e 510 {
AzureIoTClient 42:448eecc3676e 511 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 512 result = __LINE__;
AzureIoTClient 42:448eecc3676e 513 }
AzureIoTClient 42:448eecc3676e 514 else
AzureIoTClient 42:448eecc3676e 515 {
AzureIoTClient 42:448eecc3676e 516 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 42:448eecc3676e 517 if (sasHandle == NULL)
AzureIoTClient 42:448eecc3676e 518 {
AzureIoTClient 42:448eecc3676e 519 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 42:448eecc3676e 520 result = __LINE__;
AzureIoTClient 42:448eecc3676e 521 }
AzureIoTClient 42:448eecc3676e 522 else
AzureIoTClient 42:448eecc3676e 523 {
AzureIoTClient 42:448eecc3676e 524 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 525 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 526 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 42:448eecc3676e 527 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 42:448eecc3676e 528 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 529 STRING_c_str(relativePathNotification), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 530 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 531 messageBody, /*BUFFER_HANDLE requestContent*/
AzureIoTClient 42:448eecc3676e 532 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 533 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 42:448eecc3676e 534 NULL
AzureIoTClient 42:448eecc3676e 535 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 536 {
AzureIoTClient 42:448eecc3676e 537 /*Codes_SRS_IOTHUBCLIENT_LL_02_079: [ If HTTPAPIEX_SAS_ExecuteRequest fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 538 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 539 result = __LINE__;
AzureIoTClient 42:448eecc3676e 540 ;
AzureIoTClient 42:448eecc3676e 541 }
AzureIoTClient 42:448eecc3676e 542 else
AzureIoTClient 42:448eecc3676e 543 {
AzureIoTClient 42:448eecc3676e 544 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 545 {
AzureIoTClient 42:448eecc3676e 546 /*Codes_SRS_IOTHUBCLIENT_LL_02_087: [If the statusCode of the HTTP request is greater than or equal to 300 then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR]*/
AzureIoTClient 42:448eecc3676e 547 result = __LINE__;
AzureIoTClient 42:448eecc3676e 548 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 549 }
AzureIoTClient 42:448eecc3676e 550 else
AzureIoTClient 42:448eecc3676e 551 {
AzureIoTClient 42:448eecc3676e 552 result = 0;
AzureIoTClient 42:448eecc3676e 553 }
AzureIoTClient 42:448eecc3676e 554 }
AzureIoTClient 42:448eecc3676e 555 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 42:448eecc3676e 556 }
AzureIoTClient 42:448eecc3676e 557 STRING_delete(empty);
AzureIoTClient 42:448eecc3676e 558 }
AzureIoTClient 42:448eecc3676e 559 break;
AzureIoTClient 42:448eecc3676e 560 }
AzureIoTClient 42:448eecc3676e 561 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 562 {
AzureIoTClient 42:448eecc3676e 563 unsigned int notificationStatusCode;
AzureIoTClient 42:448eecc3676e 564 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 565 iotHubHttpApiExHandle,
AzureIoTClient 42:448eecc3676e 566 HTTPAPI_REQUEST_POST,
AzureIoTClient 42:448eecc3676e 567 STRING_c_str(relativePathNotification),
AzureIoTClient 42:448eecc3676e 568 requestHttpHeaders,
AzureIoTClient 42:448eecc3676e 569 messageBody,
AzureIoTClient 42:448eecc3676e 570 &notificationStatusCode,
AzureIoTClient 42:448eecc3676e 571 NULL,
AzureIoTClient 42:448eecc3676e 572 NULL) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 573 {
AzureIoTClient 42:448eecc3676e 574 LogError("unable to do HTTPAPIEX_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 575 result = __LINE__;
AzureIoTClient 42:448eecc3676e 576 }
AzureIoTClient 42:448eecc3676e 577 else
AzureIoTClient 42:448eecc3676e 578 {
AzureIoTClient 42:448eecc3676e 579 if (notificationStatusCode >= 300)
AzureIoTClient 42:448eecc3676e 580 {
AzureIoTClient 42:448eecc3676e 581 /*Codes_SRS_IOTHUBCLIENT_LL_02_087: [If the statusCode of the HTTP request is greater than or equal to 300 then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR]*/
AzureIoTClient 42:448eecc3676e 582 LogError("server didn't like the notification request");
AzureIoTClient 42:448eecc3676e 583 result = __LINE__;
AzureIoTClient 42:448eecc3676e 584 }
AzureIoTClient 42:448eecc3676e 585 else
AzureIoTClient 42:448eecc3676e 586 {
AzureIoTClient 42:448eecc3676e 587 result = 0;
AzureIoTClient 42:448eecc3676e 588 }
AzureIoTClient 42:448eecc3676e 589 }
AzureIoTClient 42:448eecc3676e 590 break;
AzureIoTClient 42:448eecc3676e 591 }
AzureIoTClient 42:448eecc3676e 592 } /*switch authorizationScheme*/
AzureIoTClient 42:448eecc3676e 593 }
AzureIoTClient 42:448eecc3676e 594 STRING_delete(relativePathNotification);
AzureIoTClient 42:448eecc3676e 595 }
AzureIoTClient 42:448eecc3676e 596 }
AzureIoTClient 42:448eecc3676e 597 STRING_delete(uriResource);
AzureIoTClient 42:448eecc3676e 598 }
AzureIoTClient 42:448eecc3676e 599 return result;
AzureIoTClient 42:448eecc3676e 600 }
AzureIoTClient 42:448eecc3676e 601
AzureIoTClient 42:448eecc3676e 602 IOTHUB_CLIENT_RESULT IoTHubClient_LL_UploadToBlob_Impl(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle, const char* destinationFileName, const unsigned char* source, size_t size)
AzureIoTClient 42:448eecc3676e 603 {
AzureIoTClient 42:448eecc3676e 604 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 42:448eecc3676e 605
AzureIoTClient 42:448eecc3676e 606 /*Codes_SRS_IOTHUBCLIENT_LL_02_061: [ If handle is NULL then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 42:448eecc3676e 607 /*Codes_SRS_IOTHUBCLIENT_LL_02_062: [ If destinationFileName is NULL then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 42:448eecc3676e 608 /*Codes_SRS_IOTHUBCLIENT_LL_02_063: [ If source is NULL and size is greater than 0 then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 42:448eecc3676e 609 if (
AzureIoTClient 42:448eecc3676e 610 (handle == NULL) ||
AzureIoTClient 42:448eecc3676e 611 (destinationFileName == NULL) ||
AzureIoTClient 42:448eecc3676e 612 ((source == NULL) && (size > 0)) ||
AzureIoTClient 42:448eecc3676e 613 (size >= 64*1024*1024)
AzureIoTClient 42:448eecc3676e 614 )
AzureIoTClient 42:448eecc3676e 615 {
AzureIoTClient 42:448eecc3676e 616 LogError("invalid argument detected handle=%p destinationFileName=%p source=%p size=%zu", handle, destinationFileName, source, size);
AzureIoTClient 42:448eecc3676e 617 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 42:448eecc3676e 618 }
AzureIoTClient 42:448eecc3676e 619 else
AzureIoTClient 42:448eecc3676e 620 {
AzureIoTClient 42:448eecc3676e 621 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 622
AzureIoTClient 42:448eecc3676e 623 /*Codes_SRS_IOTHUBCLIENT_LL_02_064: [ IoTHubClient_LL_UploadToBlob shall create an HTTPAPIEX_HANDLE to the IoTHub hostname. ]*/
AzureIoTClient 42:448eecc3676e 624 HTTPAPIEX_HANDLE iotHubHttpApiExHandle = HTTPAPIEX_Create(handleData->hostname);
AzureIoTClient 42:448eecc3676e 625
AzureIoTClient 42:448eecc3676e 626 /*Codes_SRS_IOTHUBCLIENT_LL_02_065: [ If creating the HTTPAPIEX_HANDLE fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 627 if (iotHubHttpApiExHandle == NULL)
AzureIoTClient 42:448eecc3676e 628 {
AzureIoTClient 42:448eecc3676e 629 LogError("unable to HTTPAPIEX_Create");
AzureIoTClient 42:448eecc3676e 630 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 631 }
AzureIoTClient 42:448eecc3676e 632 else
AzureIoTClient 42:448eecc3676e 633 {
AzureIoTClient 42:448eecc3676e 634 STRING_HANDLE correlationId = STRING_new();
AzureIoTClient 42:448eecc3676e 635 if (correlationId == NULL)
AzureIoTClient 42:448eecc3676e 636 {
AzureIoTClient 42:448eecc3676e 637 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 638 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 639 }
AzureIoTClient 42:448eecc3676e 640 else
AzureIoTClient 42:448eecc3676e 641 {
AzureIoTClient 42:448eecc3676e 642 STRING_HANDLE sasUri = STRING_new();
AzureIoTClient 42:448eecc3676e 643 if (sasUri == NULL)
AzureIoTClient 42:448eecc3676e 644 {
AzureIoTClient 42:448eecc3676e 645 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 646 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 647 }
AzureIoTClient 42:448eecc3676e 648 else
AzureIoTClient 42:448eecc3676e 649 {
AzureIoTClient 42:448eecc3676e 650 /*Codes_SRS_IOTHUBCLIENT_LL_02_070: [ IoTHubClient_LL_UploadToBlob shall create request HTTP headers. ]*/
AzureIoTClient 42:448eecc3676e 651 HTTP_HEADERS_HANDLE requestHttpHeaders = HTTPHeaders_Alloc(); /*these are build by step 1 and used by step 3 too*/
AzureIoTClient 42:448eecc3676e 652 if (requestHttpHeaders == NULL)
AzureIoTClient 42:448eecc3676e 653 {
AzureIoTClient 42:448eecc3676e 654 LogError("unable to HTTPHeaders_Alloc");
AzureIoTClient 42:448eecc3676e 655 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 656 }
AzureIoTClient 42:448eecc3676e 657 else
AzureIoTClient 42:448eecc3676e 658 {
AzureIoTClient 42:448eecc3676e 659 /*do step 1*/
AzureIoTClient 42:448eecc3676e 660 if (IoTHubClient_LL_UploadToBlob_step1and2(handleData, iotHubHttpApiExHandle, requestHttpHeaders, destinationFileName, correlationId, sasUri) != 0)
AzureIoTClient 42:448eecc3676e 661 {
AzureIoTClient 42:448eecc3676e 662 LogError("error in IoTHubClient_LL_UploadToBlob_step1");
AzureIoTClient 42:448eecc3676e 663 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 664 }
AzureIoTClient 42:448eecc3676e 665 else
AzureIoTClient 42:448eecc3676e 666 {
AzureIoTClient 42:448eecc3676e 667 /*do step 2.*/
AzureIoTClient 42:448eecc3676e 668
AzureIoTClient 42:448eecc3676e 669 unsigned int httpResponse;
AzureIoTClient 42:448eecc3676e 670 BUFFER_HANDLE responseToIoTHub = BUFFER_new();
AzureIoTClient 42:448eecc3676e 671 if (responseToIoTHub == NULL)
AzureIoTClient 42:448eecc3676e 672 {
AzureIoTClient 42:448eecc3676e 673 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 674 LogError("unable to BUFFER_new");
AzureIoTClient 42:448eecc3676e 675 }
AzureIoTClient 42:448eecc3676e 676 else
AzureIoTClient 42:448eecc3676e 677 {
AzureIoTClient 42:448eecc3676e 678 int step2success;
AzureIoTClient 42:448eecc3676e 679 /*Codes_SRS_IOTHUBCLIENT_LL_02_083: [ IoTHubClient_LL_UploadToBlob shall call Blob_UploadFromSasUri and capture the HTTP return code and HTTP body. ]*/
AzureIoTClient 42:448eecc3676e 680 step2success = (Blob_UploadFromSasUri(STRING_c_str(sasUri), source, size, &httpResponse, responseToIoTHub) == BLOB_OK);
AzureIoTClient 42:448eecc3676e 681 if (!step2success)
AzureIoTClient 42:448eecc3676e 682 {
AzureIoTClient 42:448eecc3676e 683 /*Codes_SRS_IOTHUBCLIENT_LL_02_084: [ If Blob_UploadFromSasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 42:448eecc3676e 684 LogError("unable to Blob_UploadFromSasUri");
AzureIoTClient 42:448eecc3676e 685
AzureIoTClient 42:448eecc3676e 686 /*do step 3*/ /*try*/
AzureIoTClient 42:448eecc3676e 687 /*Codes_SRS_IOTHUBCLIENT_LL_02_091: [ If step 2 fails without establishing an HTTP dialogue, then the HTTP message body shall look like: ]*/
AzureIoTClient 42:448eecc3676e 688 if (BUFFER_build(responseToIoTHub, (const unsigned char*)FILE_UPLOAD_FAILED_BODY, sizeof(FILE_UPLOAD_FAILED_BODY) / sizeof(FILE_UPLOAD_FAILED_BODY[0])) == 0)
AzureIoTClient 42:448eecc3676e 689 {
AzureIoTClient 42:448eecc3676e 690 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, responseToIoTHub) != 0)
AzureIoTClient 42:448eecc3676e 691 {
AzureIoTClient 42:448eecc3676e 692 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 42:448eecc3676e 693 }
AzureIoTClient 42:448eecc3676e 694 }
AzureIoTClient 42:448eecc3676e 695 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 696 }
AzureIoTClient 42:448eecc3676e 697 else
AzureIoTClient 42:448eecc3676e 698 {
AzureIoTClient 42:448eecc3676e 699 /*must make a json*/
AzureIoTClient 42:448eecc3676e 700
AzureIoTClient 42:448eecc3676e 701 int requiredStringLength = snprintf(NULL, 0, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 42:448eecc3676e 702
AzureIoTClient 42:448eecc3676e 703 char* requiredString = malloc(requiredStringLength + 1);
AzureIoTClient 42:448eecc3676e 704 if (requiredString == 0)
AzureIoTClient 42:448eecc3676e 705 {
AzureIoTClient 42:448eecc3676e 706 LogError("unable to malloc");
AzureIoTClient 42:448eecc3676e 707 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 708 }
AzureIoTClient 42:448eecc3676e 709 else
AzureIoTClient 42:448eecc3676e 710 {
AzureIoTClient 42:448eecc3676e 711 /*do again snprintf*/
AzureIoTClient 42:448eecc3676e 712 (void)snprintf(requiredString, requiredStringLength + 1, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 42:448eecc3676e 713 BUFFER_HANDLE toBeTransmitted = BUFFER_create(requiredString, requiredStringLength);
AzureIoTClient 42:448eecc3676e 714 if (toBeTransmitted == NULL)
AzureIoTClient 42:448eecc3676e 715 {
AzureIoTClient 42:448eecc3676e 716 LogError("unable to BUFFER_create");
AzureIoTClient 42:448eecc3676e 717 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 718 }
AzureIoTClient 42:448eecc3676e 719 else
AzureIoTClient 42:448eecc3676e 720 {
AzureIoTClient 42:448eecc3676e 721 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, toBeTransmitted) != 0)
AzureIoTClient 42:448eecc3676e 722 {
AzureIoTClient 42:448eecc3676e 723 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 42:448eecc3676e 724 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 725 }
AzureIoTClient 42:448eecc3676e 726 else
AzureIoTClient 42:448eecc3676e 727 {
AzureIoTClient 42:448eecc3676e 728 result = (httpResponse < 300) ? IOTHUB_CLIENT_OK : IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 729 }
AzureIoTClient 42:448eecc3676e 730 BUFFER_delete(toBeTransmitted);
AzureIoTClient 42:448eecc3676e 731 }
AzureIoTClient 42:448eecc3676e 732 free(requiredString);
AzureIoTClient 42:448eecc3676e 733 }
AzureIoTClient 42:448eecc3676e 734 }
AzureIoTClient 42:448eecc3676e 735 BUFFER_delete(responseToIoTHub);
AzureIoTClient 42:448eecc3676e 736 }
AzureIoTClient 42:448eecc3676e 737 }
AzureIoTClient 42:448eecc3676e 738 HTTPHeaders_Free(requestHttpHeaders);
AzureIoTClient 42:448eecc3676e 739 }
AzureIoTClient 42:448eecc3676e 740 STRING_delete(sasUri);
AzureIoTClient 42:448eecc3676e 741 }
AzureIoTClient 42:448eecc3676e 742 STRING_delete(correlationId);
AzureIoTClient 42:448eecc3676e 743 }
AzureIoTClient 42:448eecc3676e 744 HTTPAPIEX_Destroy(iotHubHttpApiExHandle);
AzureIoTClient 42:448eecc3676e 745 }
AzureIoTClient 42:448eecc3676e 746 }
AzureIoTClient 42:448eecc3676e 747 return result;
AzureIoTClient 42:448eecc3676e 748 }
AzureIoTClient 42:448eecc3676e 749
AzureIoTClient 42:448eecc3676e 750 void IoTHubClient_LL_UploadToBlob_Destroy(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle)
AzureIoTClient 42:448eecc3676e 751 {
AzureIoTClient 42:448eecc3676e 752 if (handle == NULL)
AzureIoTClient 42:448eecc3676e 753 {
AzureIoTClient 42:448eecc3676e 754 LogError("unexepected NULL argument");
AzureIoTClient 42:448eecc3676e 755 }
AzureIoTClient 42:448eecc3676e 756 else
AzureIoTClient 42:448eecc3676e 757 {
AzureIoTClient 42:448eecc3676e 758 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 759 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 760 {
AzureIoTClient 42:448eecc3676e 761 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 762 {
AzureIoTClient 42:448eecc3676e 763 STRING_delete(handleData->credentials.sas);
AzureIoTClient 42:448eecc3676e 764 break;
AzureIoTClient 42:448eecc3676e 765 }
AzureIoTClient 42:448eecc3676e 766 case(DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 767 {
AzureIoTClient 42:448eecc3676e 768 STRING_delete(handleData->credentials.deviceKey);
AzureIoTClient 42:448eecc3676e 769 break;
AzureIoTClient 42:448eecc3676e 770 }
AzureIoTClient 42:448eecc3676e 771 default:
AzureIoTClient 42:448eecc3676e 772 {
AzureIoTClient 42:448eecc3676e 773 LogError("INTERNAL ERROR");
AzureIoTClient 42:448eecc3676e 774 break;
AzureIoTClient 42:448eecc3676e 775 }
AzureIoTClient 42:448eecc3676e 776 }
AzureIoTClient 42:448eecc3676e 777 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 778 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 779 free(handleData);
AzureIoTClient 42:448eecc3676e 780 }
AzureIoTClient 42:448eecc3676e 781 }