Microsoft Azure IoTHub client libraries

Dependents:   sht15_remote_monitoring RobotArmDemo iothub_client_sample_amqp f767zi_mqtt ... more

This library implements the Microsoft Azure IoTHub client library. The code is replicated from https://github.com/Azure/azure-iot-sdks

Committer:
AzureIoTClient
Date:
Fri Aug 12 10:04:01 2016 -0700
Revision:
48:cc5d91f2b06d
Parent:
47:aaa262b5f898
Child:
57:4524910c6445
1.0.10

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
Azure.IoT Build 45:54c11b1b1407 4 #ifdef DONT_USE_UPLOADTOBLOB
Azure.IoT Build 45:54c11b1b1407 5 #error "trying to compile iothub_client_ll_uploadtoblob.c while the symbol DONT_USE_UPLOADTOBLOB is #define'd"
Azure.IoT Build 45:54c11b1b1407 6 #else
Azure.IoT Build 45:54c11b1b1407 7
AzureIoTClient 42:448eecc3676e 8 #include <stdlib.h>
AzureIoTClient 42:448eecc3676e 9 #ifdef _CRTDBG_MAP_ALLOC
AzureIoTClient 42:448eecc3676e 10 #include <crtdbg.h>
AzureIoTClient 42:448eecc3676e 11 #endif
AzureIoTClient 42:448eecc3676e 12 #include <string.h>
AzureIoTClient 42:448eecc3676e 13 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 42:448eecc3676e 14 #include "azure_c_shared_utility/string_tokenizer.h"
AzureIoTClient 42:448eecc3676e 15 #include "azure_c_shared_utility/doublylinkedlist.h"
Azure.IoT Build 45:54c11b1b1407 16 #include "azure_c_shared_utility/xlogging.h"
AzureIoTClient 42:448eecc3676e 17 #include "azure_c_shared_utility/tickcounter.h"
AzureIoTClient 42:448eecc3676e 18 #include "azure_c_shared_utility/httpapiexsas.h"
AzureIoTClient 42:448eecc3676e 19
AzureIoTClient 42:448eecc3676e 20 #include "iothub_client_ll.h"
AzureIoTClient 48:cc5d91f2b06d 21 #include "iothub_client_options.h"
AzureIoTClient 42:448eecc3676e 22 #include "iothub_client_private.h"
AzureIoTClient 42:448eecc3676e 23 #include "iothub_client_version.h"
AzureIoTClient 42:448eecc3676e 24 #include "iothub_transport_ll.h"
AzureIoTClient 42:448eecc3676e 25 #include "parson.h"
AzureIoTClient 42:448eecc3676e 26 #include "iothub_client_ll_uploadtoblob.h"
AzureIoTClient 42:448eecc3676e 27 #include "blob.h"
AzureIoTClient 42:448eecc3676e 28
AzureIoTClient 47:aaa262b5f898 29
AzureIoTClient 47:aaa262b5f898 30 #ifdef WINCE
AzureIoTClient 47:aaa262b5f898 31 #include <stdarg.h>
AzureIoTClient 47:aaa262b5f898 32 // Returns number of characters copied.
AzureIoTClient 47:aaa262b5f898 33 int snprintf(char * s, size_t n, const char * format, ...)
AzureIoTClient 47:aaa262b5f898 34 {
AzureIoTClient 48:cc5d91f2b06d 35 int result;
AzureIoTClient 48:cc5d91f2b06d 36 va_list args;
AzureIoTClient 48:cc5d91f2b06d 37 va_start(args, format);
AzureIoTClient 48:cc5d91f2b06d 38 result = vsnprintf(s, n, format, args);
AzureIoTClient 48:cc5d91f2b06d 39 va_end(args);
AzureIoTClient 48:cc5d91f2b06d 40 return result;
AzureIoTClient 47:aaa262b5f898 41 }
AzureIoTClient 47:aaa262b5f898 42 #endif
AzureIoTClient 47:aaa262b5f898 43
AzureIoTClient 47:aaa262b5f898 44
AzureIoTClient 42:448eecc3676e 45 /*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 46 #define FILE_UPLOAD_FAILED_BODY "{ \"isSuccess\":false, \"statusCode\":-1,\"statusDescription\" : \"client not able to connect with the server\" }"
AzureIoTClient 42:448eecc3676e 47
AzureIoTClient 42:448eecc3676e 48 #define AUTHORIZATION_SCHEME_VALUES \
AzureIoTClient 42:448eecc3676e 49 DEVICE_KEY, \
AzureIoTClient 46:6a69294b6119 50 X509, \
AzureIoTClient 42:448eecc3676e 51 SAS_TOKEN
AzureIoTClient 42:448eecc3676e 52 DEFINE_ENUM(AUTHORIZATION_SCHEME, AUTHORIZATION_SCHEME_VALUES);
AzureIoTClient 42:448eecc3676e 53
AzureIoTClient 46:6a69294b6119 54 typedef struct UPLOADTOBLOB_X509_CREDENTIALS_TAG
AzureIoTClient 46:6a69294b6119 55 {
AzureIoTClient 46:6a69294b6119 56 const char* x509certificate;
AzureIoTClient 46:6a69294b6119 57 const char* x509privatekey;
AzureIoTClient 46:6a69294b6119 58 }UPLOADTOBLOB_X509_CREDENTIALS;
AzureIoTClient 46:6a69294b6119 59
AzureIoTClient 42:448eecc3676e 60 typedef struct IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA_TAG
AzureIoTClient 42:448eecc3676e 61 {
AzureIoTClient 42:448eecc3676e 62 STRING_HANDLE deviceId; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 63 const char* hostname; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 64 AUTHORIZATION_SCHEME authorizationScheme; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 65 union {
AzureIoTClient 42:448eecc3676e 66 STRING_HANDLE deviceKey; /*used when authorizationScheme is DEVICE_KEY*/
AzureIoTClient 42:448eecc3676e 67 STRING_HANDLE sas; /*used when authorizationScheme is SAS_TOKEN*/
AzureIoTClient 46:6a69294b6119 68 UPLOADTOBLOB_X509_CREDENTIALS x509credentials; /*assumed to be used when both deviceKey and deviceSasToken are NULL*/
AzureIoTClient 42:448eecc3676e 69 } credentials; /*needed for file upload*/
AzureIoTClient 42:448eecc3676e 70 }IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA;
AzureIoTClient 42:448eecc3676e 71
AzureIoTClient 42:448eecc3676e 72 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE IoTHubClient_LL_UploadToBlob_Create(const IOTHUB_CLIENT_CONFIG* config)
AzureIoTClient 42:448eecc3676e 73 {
AzureIoTClient 42:448eecc3676e 74 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = malloc(sizeof(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA));
AzureIoTClient 42:448eecc3676e 75 if (handleData == NULL)
AzureIoTClient 42:448eecc3676e 76 {
AzureIoTClient 42:448eecc3676e 77 LogError("oom - malloc");
AzureIoTClient 42:448eecc3676e 78 /*return as is*/
AzureIoTClient 42:448eecc3676e 79 }
AzureIoTClient 42:448eecc3676e 80 else
AzureIoTClient 42:448eecc3676e 81 {
AzureIoTClient 42:448eecc3676e 82 size_t iotHubNameLength = strlen(config->iotHubName);
AzureIoTClient 42:448eecc3676e 83 size_t iotHubSuffixLength = strlen(config->iotHubSuffix);
AzureIoTClient 42:448eecc3676e 84 handleData->deviceId = STRING_construct(config->deviceId);
AzureIoTClient 42:448eecc3676e 85 if (handleData->deviceId == NULL)
AzureIoTClient 42:448eecc3676e 86 {
AzureIoTClient 42:448eecc3676e 87 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 88 free(handleData);
AzureIoTClient 42:448eecc3676e 89 handleData = NULL;
AzureIoTClient 42:448eecc3676e 90 }
AzureIoTClient 42:448eecc3676e 91 else
AzureIoTClient 42:448eecc3676e 92 {
AzureIoTClient 42:448eecc3676e 93 handleData->hostname = malloc(iotHubNameLength + 1 + iotHubSuffixLength + 1); /*first +1 is because "." the second +1 is because \0*/
AzureIoTClient 42:448eecc3676e 94 if (handleData->hostname == NULL)
AzureIoTClient 42:448eecc3676e 95 {
AzureIoTClient 42:448eecc3676e 96 LogError("malloc failed");
AzureIoTClient 42:448eecc3676e 97 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 98 free(handleData);
AzureIoTClient 42:448eecc3676e 99 handleData = NULL;
AzureIoTClient 42:448eecc3676e 100 }
AzureIoTClient 42:448eecc3676e 101 else
AzureIoTClient 42:448eecc3676e 102 {
AzureIoTClient 42:448eecc3676e 103 memcpy((char*)handleData->hostname, config->iotHubName, iotHubNameLength);
AzureIoTClient 42:448eecc3676e 104 ((char*)handleData->hostname)[iotHubNameLength] = '.';
AzureIoTClient 42:448eecc3676e 105 memcpy((char*)handleData->hostname + iotHubNameLength + 1, config->iotHubSuffix, iotHubSuffixLength + 1); /*+1 will copy the \0 too*/
AzureIoTClient 46:6a69294b6119 106 if ((config->deviceSasToken != NULL) && (config->deviceKey == NULL))
AzureIoTClient 42:448eecc3676e 107 {
AzureIoTClient 42:448eecc3676e 108 handleData->authorizationScheme = SAS_TOKEN;
AzureIoTClient 42:448eecc3676e 109 handleData->credentials.sas = STRING_construct(config->deviceSasToken);
AzureIoTClient 42:448eecc3676e 110 if (handleData->credentials.sas == NULL)
AzureIoTClient 42:448eecc3676e 111 {
AzureIoTClient 42:448eecc3676e 112 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 113 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 114 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 115 free(handleData);
AzureIoTClient 42:448eecc3676e 116 handleData = NULL;
AzureIoTClient 42:448eecc3676e 117 }
AzureIoTClient 42:448eecc3676e 118 else
AzureIoTClient 42:448eecc3676e 119 {
AzureIoTClient 42:448eecc3676e 120 /*return as is*/
AzureIoTClient 42:448eecc3676e 121 }
AzureIoTClient 42:448eecc3676e 122 }
AzureIoTClient 46:6a69294b6119 123 else if ((config->deviceSasToken == NULL) && (config->deviceKey != NULL))
AzureIoTClient 42:448eecc3676e 124 {
AzureIoTClient 42:448eecc3676e 125 handleData->authorizationScheme = DEVICE_KEY;
AzureIoTClient 42:448eecc3676e 126 handleData->credentials.deviceKey = STRING_construct(config->deviceKey);
AzureIoTClient 42:448eecc3676e 127 if (handleData->credentials.deviceKey == NULL)
AzureIoTClient 42:448eecc3676e 128 {
AzureIoTClient 42:448eecc3676e 129 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 130 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 131 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 132 free(handleData);
AzureIoTClient 42:448eecc3676e 133 handleData = NULL;
AzureIoTClient 42:448eecc3676e 134 }
AzureIoTClient 42:448eecc3676e 135 else
AzureIoTClient 42:448eecc3676e 136 {
AzureIoTClient 42:448eecc3676e 137 /*return as is*/
AzureIoTClient 42:448eecc3676e 138 }
AzureIoTClient 42:448eecc3676e 139 }
AzureIoTClient 46:6a69294b6119 140 else if ((config->deviceSasToken == NULL) && (config->deviceKey == NULL))
AzureIoTClient 46:6a69294b6119 141 {
AzureIoTClient 46:6a69294b6119 142 handleData->authorizationScheme = X509;
AzureIoTClient 46:6a69294b6119 143 handleData->credentials.x509credentials.x509certificate = NULL;
AzureIoTClient 46:6a69294b6119 144 handleData->credentials.x509credentials.x509privatekey = NULL;
AzureIoTClient 46:6a69294b6119 145 /*return as is*/
AzureIoTClient 46:6a69294b6119 146 }
AzureIoTClient 42:448eecc3676e 147 }
AzureIoTClient 42:448eecc3676e 148 }
AzureIoTClient 42:448eecc3676e 149 }
AzureIoTClient 42:448eecc3676e 150 return (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE)handleData;
AzureIoTClient 42:448eecc3676e 151
AzureIoTClient 42:448eecc3676e 152 }
AzureIoTClient 42:448eecc3676e 153
AzureIoTClient 42:448eecc3676e 154 /*returns 0 when correlationId, sasUri contain data*/
AzureIoTClient 42:448eecc3676e 155 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 156 STRING_HANDLE correlationId, STRING_HANDLE sasUri)
AzureIoTClient 42:448eecc3676e 157 {
AzureIoTClient 42:448eecc3676e 158 int result;
AzureIoTClient 42:448eecc3676e 159
AzureIoTClient 42:448eecc3676e 160 /*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 161 STRING_HANDLE relativePath = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 162 if (relativePath == NULL)
AzureIoTClient 42:448eecc3676e 163 {
AzureIoTClient 42:448eecc3676e 164 /*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 165 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 166 result = __LINE__;
AzureIoTClient 42:448eecc3676e 167 }
AzureIoTClient 42:448eecc3676e 168 else
AzureIoTClient 42:448eecc3676e 169 {
AzureIoTClient 42:448eecc3676e 170 if (!(
AzureIoTClient 42:448eecc3676e 171 (STRING_concat_with_STRING(relativePath, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 172 (STRING_concat(relativePath, "/files/") == 0) &&
AzureIoTClient 42:448eecc3676e 173 (STRING_concat(relativePath, destinationFileName) == 0) &&
AzureIoTClient 42:448eecc3676e 174 (STRING_concat(relativePath, API_VERSION) == 0)
AzureIoTClient 42:448eecc3676e 175 ))
AzureIoTClient 42:448eecc3676e 176 {
AzureIoTClient 42:448eecc3676e 177 /*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 178 LogError("unable to concatenate STRING");
AzureIoTClient 42:448eecc3676e 179 result = __LINE__;
AzureIoTClient 42:448eecc3676e 180 }
AzureIoTClient 42:448eecc3676e 181 else
AzureIoTClient 42:448eecc3676e 182 {
AzureIoTClient 42:448eecc3676e 183 /*Codes_SRS_IOTHUBCLIENT_LL_02_068: [ IoTHubClient_LL_UploadToBlob shall create an HTTP responseContent BUFFER_HANDLE. ]*/
AzureIoTClient 42:448eecc3676e 184 BUFFER_HANDLE responseContent = BUFFER_new();
AzureIoTClient 42:448eecc3676e 185 if (responseContent == NULL)
AzureIoTClient 42:448eecc3676e 186 {
AzureIoTClient 42:448eecc3676e 187 /*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 188 result = __LINE__;
AzureIoTClient 42:448eecc3676e 189 LogError("unable to BUFFER_new");
AzureIoTClient 42:448eecc3676e 190 }
AzureIoTClient 42:448eecc3676e 191 else
AzureIoTClient 42:448eecc3676e 192 {
AzureIoTClient 42:448eecc3676e 193 /*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 46:6a69294b6119 194 /*Codes_SRS_IOTHUBCLIENT_LL_02_107: [ - "Authorization" header shall not be build. ]*/
AzureIoTClient 42:448eecc3676e 195 if (!(
AzureIoTClient 42:448eecc3676e 196 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Content-Type", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 42:448eecc3676e 197 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Accept", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 42:448eecc3676e 198 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "User-Agent", "iothubclient/" IOTHUB_SDK_VERSION) == HTTP_HEADERS_OK) &&
AzureIoTClient 46:6a69294b6119 199 (handleData->authorizationScheme==X509 || (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Authorization", "") == HTTP_HEADERS_OK))
AzureIoTClient 42:448eecc3676e 200 ))
AzureIoTClient 42:448eecc3676e 201 {
AzureIoTClient 42:448eecc3676e 202 /*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 203 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 42:448eecc3676e 204 result = __LINE__;
AzureIoTClient 42:448eecc3676e 205 }
AzureIoTClient 42:448eecc3676e 206 else
AzureIoTClient 42:448eecc3676e 207 {
AzureIoTClient 42:448eecc3676e 208 int wasIoTHubRequestSuccess = 0; /*!=0 means responseContent has a buffer that should be parsed by parson after executing the below switch*/
AzureIoTClient 46:6a69294b6119 209 /* set the result to error by default */
AzureIoTClient 46:6a69294b6119 210 result = __LINE__;
AzureIoTClient 42:448eecc3676e 211 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 212 {
AzureIoTClient 42:448eecc3676e 213 default:
AzureIoTClient 42:448eecc3676e 214 {
AzureIoTClient 42:448eecc3676e 215 /*wasIoTHubRequestSuccess takes care of the return value*/
AzureIoTClient 42:448eecc3676e 216 LogError("Internal Error: unexpected value in handleData->authorizationScheme = %d", handleData->authorizationScheme);
AzureIoTClient 46:6a69294b6119 217 result = __LINE__;
AzureIoTClient 46:6a69294b6119 218 break;
AzureIoTClient 46:6a69294b6119 219 }
AzureIoTClient 46:6a69294b6119 220 case(X509):
AzureIoTClient 46:6a69294b6119 221 {
AzureIoTClient 46:6a69294b6119 222 unsigned int statusCode;
AzureIoTClient 46:6a69294b6119 223 /*Codes_SRS_IOTHUBCLIENT_LL_02_108: [ IoTHubClient_LL_UploadToBlob shall execute HTTPAPIEX_ExecuteRequest passing the following information for arguments: ]*/
AzureIoTClient 46:6a69294b6119 224 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 46:6a69294b6119 225 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the handle created at the beginning of `IoTHubClient_LL_UploadToBlob`*/
AzureIoTClient 46:6a69294b6119 226 HTTPAPI_REQUEST_GET, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 46:6a69294b6119 227 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 46:6a69294b6119 228 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 46:6a69294b6119 229 NULL, /*BUFFER_HANDLE requestContent - NULL*/
AzureIoTClient 46:6a69294b6119 230 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 46:6a69294b6119 231 NULL, /*HTTP_HEADERS_HANDLE responseHttpHeadersHandl - NULL*/
AzureIoTClient 46:6a69294b6119 232 responseContent /*BUFFER_HANDLE responseContent - the HTTP response BUFFER_HANDLE - responseContent*/
AzureIoTClient 46:6a69294b6119 233 ) != HTTPAPIEX_OK)
AzureIoTClient 46:6a69294b6119 234 {
AzureIoTClient 46:6a69294b6119 235 /*Codes_SRS_IOTHUBCLIENT_LL_02_076: [ If HTTPAPIEX_ExecuteRequest call fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 236 result = __LINE__;
AzureIoTClient 46:6a69294b6119 237 LogError("unable to HTTPAPIEX_ExecuteRequest");
AzureIoTClient 46:6a69294b6119 238 }
AzureIoTClient 46:6a69294b6119 239 else
AzureIoTClient 46:6a69294b6119 240 {
AzureIoTClient 46:6a69294b6119 241 /*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 46:6a69294b6119 242 if (statusCode >= 300)
AzureIoTClient 46:6a69294b6119 243 {
AzureIoTClient 46:6a69294b6119 244 result = __LINE__;
AzureIoTClient 46:6a69294b6119 245 LogError("HTTP code was %u", statusCode);
AzureIoTClient 46:6a69294b6119 246 }
AzureIoTClient 46:6a69294b6119 247 else
AzureIoTClient 46:6a69294b6119 248 {
AzureIoTClient 46:6a69294b6119 249 wasIoTHubRequestSuccess = 1;
AzureIoTClient 46:6a69294b6119 250 }
AzureIoTClient 46:6a69294b6119 251 }
AzureIoTClient 42:448eecc3676e 252 break;
AzureIoTClient 42:448eecc3676e 253 }
AzureIoTClient 42:448eecc3676e 254 case (SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 255 {
AzureIoTClient 42:448eecc3676e 256 const char* sasToken = STRING_c_str(handleData->credentials.sas);
AzureIoTClient 42:448eecc3676e 257 /*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 258 if (HTTPHeaders_ReplaceHeaderNameValuePair(requestHttpHeaders, "Authorization", sasToken) != HTTP_HEADERS_OK)
AzureIoTClient 42:448eecc3676e 259 {
AzureIoTClient 42:448eecc3676e 260 /*Codes_SRS_IOTHUBCLIENT_LL_02_074: [ If adding "Authorization" fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR ]*/
AzureIoTClient 42:448eecc3676e 261 result = __LINE__;
AzureIoTClient 42:448eecc3676e 262 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 42:448eecc3676e 263 }
AzureIoTClient 42:448eecc3676e 264 else
AzureIoTClient 42:448eecc3676e 265 {
AzureIoTClient 42:448eecc3676e 266 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 267 /*Codes_SRS_IOTHUBCLIENT_LL_02_075: [ IoTHubClient_LL_UploadToBlob shall execute HTTPAPIEX_ExecuteRequest passing the following information for arguments: ]*/
AzureIoTClient 42:448eecc3676e 268 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 269 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the handle created at the beginning of `IoTHubClient_LL_UploadToBlob`*/
AzureIoTClient 42:448eecc3676e 270 HTTPAPI_REQUEST_GET, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 271 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 272 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 273 NULL, /*BUFFER_HANDLE requestContent - NULL*/
AzureIoTClient 42:448eecc3676e 274 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 275 NULL, /*HTTP_HEADERS_HANDLE responseHttpHeadersHandl - NULL*/
AzureIoTClient 42:448eecc3676e 276 responseContent /*BUFFER_HANDLE responseContent - the HTTP response BUFFER_HANDLE - responseContent*/
AzureIoTClient 42:448eecc3676e 277 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 278 {
AzureIoTClient 42:448eecc3676e 279 /*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 280 result = __LINE__;
AzureIoTClient 42:448eecc3676e 281 LogError("unable to HTTPAPIEX_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 282 }
AzureIoTClient 42:448eecc3676e 283 else
AzureIoTClient 42:448eecc3676e 284 {
AzureIoTClient 42:448eecc3676e 285 /*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 286 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 287 {
AzureIoTClient 42:448eecc3676e 288 result = __LINE__;
AzureIoTClient 42:448eecc3676e 289 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 290 }
AzureIoTClient 42:448eecc3676e 291 else
AzureIoTClient 42:448eecc3676e 292 {
AzureIoTClient 42:448eecc3676e 293 wasIoTHubRequestSuccess = 1;
AzureIoTClient 42:448eecc3676e 294 }
AzureIoTClient 42:448eecc3676e 295 }
AzureIoTClient 42:448eecc3676e 296 }
AzureIoTClient 42:448eecc3676e 297 break;
AzureIoTClient 42:448eecc3676e 298 }
AzureIoTClient 42:448eecc3676e 299 case(DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 300 {
AzureIoTClient 42:448eecc3676e 301 /*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 302 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 42:448eecc3676e 303 if (uriResource == NULL)
AzureIoTClient 42:448eecc3676e 304 {
AzureIoTClient 42:448eecc3676e 305 /*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 306 result = __LINE__;
AzureIoTClient 42:448eecc3676e 307 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 308 }
AzureIoTClient 42:448eecc3676e 309 else
AzureIoTClient 42:448eecc3676e 310 {
AzureIoTClient 42:448eecc3676e 311 if (!(
AzureIoTClient 42:448eecc3676e 312 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 42:448eecc3676e 313 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0)
AzureIoTClient 42:448eecc3676e 314 ))
AzureIoTClient 42:448eecc3676e 315 {
AzureIoTClient 42:448eecc3676e 316 /*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 317 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 42:448eecc3676e 318 result = __LINE__;
AzureIoTClient 42:448eecc3676e 319 }
AzureIoTClient 42:448eecc3676e 320 else
AzureIoTClient 42:448eecc3676e 321 {
AzureIoTClient 42:448eecc3676e 322 STRING_HANDLE empty = STRING_new();
AzureIoTClient 42:448eecc3676e 323 if (empty == NULL)
AzureIoTClient 42:448eecc3676e 324 {
AzureIoTClient 42:448eecc3676e 325 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 326 result = __LINE__;
AzureIoTClient 42:448eecc3676e 327 }
AzureIoTClient 42:448eecc3676e 328 else
AzureIoTClient 42:448eecc3676e 329 {
AzureIoTClient 42:448eecc3676e 330 /*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 331 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 42:448eecc3676e 332 if (sasHandle == NULL)
AzureIoTClient 42:448eecc3676e 333 {
AzureIoTClient 42:448eecc3676e 334 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 42:448eecc3676e 335 result = __LINE__;
AzureIoTClient 42:448eecc3676e 336 }
AzureIoTClient 42:448eecc3676e 337 else
AzureIoTClient 42:448eecc3676e 338 {
AzureIoTClient 42:448eecc3676e 339 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 340 /*Codes_SRS_IOTHUBCLIENT_LL_02_090: [ IoTHubClient_LL_UploadToBlob shall call HTTPAPIEX_SAS_ExecuteRequest passing as arguments: ]*/
AzureIoTClient 42:448eecc3676e 341 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 342 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 42:448eecc3676e 343 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 42:448eecc3676e 344 HTTPAPI_REQUEST_GET, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 345 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 346 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 347 NULL, /*BUFFER_HANDLE requestContent - NULL*/
AzureIoTClient 42:448eecc3676e 348 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 349 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 42:448eecc3676e 350 responseContent
AzureIoTClient 42:448eecc3676e 351 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 352 {
AzureIoTClient 42:448eecc3676e 353 /*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 354 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 355 result = __LINE__;
AzureIoTClient 42:448eecc3676e 356 }
AzureIoTClient 42:448eecc3676e 357 else
AzureIoTClient 42:448eecc3676e 358 {
AzureIoTClient 42:448eecc3676e 359 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 360 {
AzureIoTClient 42:448eecc3676e 361 /*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 362 result = __LINE__;
AzureIoTClient 42:448eecc3676e 363 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 364 }
AzureIoTClient 42:448eecc3676e 365 else
AzureIoTClient 42:448eecc3676e 366 {
AzureIoTClient 42:448eecc3676e 367 wasIoTHubRequestSuccess = 1;
AzureIoTClient 42:448eecc3676e 368 }
AzureIoTClient 42:448eecc3676e 369 }
AzureIoTClient 42:448eecc3676e 370 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 42:448eecc3676e 371 }
AzureIoTClient 42:448eecc3676e 372 STRING_delete(empty);
AzureIoTClient 42:448eecc3676e 373 }
AzureIoTClient 42:448eecc3676e 374 }
AzureIoTClient 42:448eecc3676e 375 STRING_delete(uriResource);
AzureIoTClient 42:448eecc3676e 376 }
AzureIoTClient 42:448eecc3676e 377 }
AzureIoTClient 42:448eecc3676e 378 } /*switch*/
AzureIoTClient 42:448eecc3676e 379
AzureIoTClient 42:448eecc3676e 380 if (wasIoTHubRequestSuccess == 0)
AzureIoTClient 42:448eecc3676e 381 {
AzureIoTClient 42:448eecc3676e 382 /*do nothing, shall be reported as an error*/
AzureIoTClient 42:448eecc3676e 383 }
AzureIoTClient 42:448eecc3676e 384 else
AzureIoTClient 42:448eecc3676e 385 {
AzureIoTClient 42:448eecc3676e 386 const unsigned char*responseContent_u_char = BUFFER_u_char(responseContent);
AzureIoTClient 42:448eecc3676e 387 size_t responseContent_length = BUFFER_length(responseContent);
AzureIoTClient 42:448eecc3676e 388 STRING_HANDLE responseAsString = STRING_from_byte_array(responseContent_u_char, responseContent_length);
AzureIoTClient 42:448eecc3676e 389 if (responseAsString == NULL)
AzureIoTClient 42:448eecc3676e 390 {
AzureIoTClient 42:448eecc3676e 391 result = __LINE__;
AzureIoTClient 42:448eecc3676e 392 LogError("unable to get the response as string");
AzureIoTClient 42:448eecc3676e 393 }
AzureIoTClient 42:448eecc3676e 394 else
AzureIoTClient 42:448eecc3676e 395 {
AzureIoTClient 42:448eecc3676e 396 /*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 397 JSON_Value* allJson = json_parse_string(STRING_c_str(responseAsString));
AzureIoTClient 42:448eecc3676e 398 if (allJson == NULL)
AzureIoTClient 42:448eecc3676e 399 {
AzureIoTClient 42:448eecc3676e 400 /*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 401 LogError("unable to json_parse_string");
AzureIoTClient 42:448eecc3676e 402 result = __LINE__;
AzureIoTClient 42:448eecc3676e 403 }
AzureIoTClient 42:448eecc3676e 404 else
AzureIoTClient 42:448eecc3676e 405 {
AzureIoTClient 42:448eecc3676e 406 JSON_Object* jsonObject = json_value_get_object(allJson);
AzureIoTClient 42:448eecc3676e 407 if (jsonObject == NULL)
AzureIoTClient 42:448eecc3676e 408 {
AzureIoTClient 42:448eecc3676e 409 /*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 410 LogError("unable to json_value_get_object");
AzureIoTClient 42:448eecc3676e 411 result = __LINE__;
AzureIoTClient 42:448eecc3676e 412 }
AzureIoTClient 42:448eecc3676e 413 else
AzureIoTClient 42:448eecc3676e 414 {
AzureIoTClient 42:448eecc3676e 415 const char* json_correlationId;
AzureIoTClient 42:448eecc3676e 416 json_correlationId = json_object_get_string(jsonObject, "correlationId");
AzureIoTClient 42:448eecc3676e 417 if (json_correlationId == NULL)
AzureIoTClient 42:448eecc3676e 418 {
AzureIoTClient 42:448eecc3676e 419 /*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 420 LogError("unable to json_object_get_string(jsonObject, \"correlationId\")");
AzureIoTClient 42:448eecc3676e 421 result = __LINE__;
AzureIoTClient 42:448eecc3676e 422 }
AzureIoTClient 42:448eecc3676e 423 else
AzureIoTClient 42:448eecc3676e 424 {
AzureIoTClient 42:448eecc3676e 425 if (STRING_copy(correlationId, json_correlationId) != 0)
AzureIoTClient 42:448eecc3676e 426 {
AzureIoTClient 42:448eecc3676e 427 /*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 428 LogError("unable to copy json_correlationId");
AzureIoTClient 42:448eecc3676e 429 result = __LINE__;
AzureIoTClient 42:448eecc3676e 430 }
AzureIoTClient 42:448eecc3676e 431 else
AzureIoTClient 42:448eecc3676e 432 {
AzureIoTClient 42:448eecc3676e 433 const char* json_hostName = json_object_get_string(jsonObject, "hostName");
AzureIoTClient 42:448eecc3676e 434 if (json_hostName == NULL)
AzureIoTClient 42:448eecc3676e 435 {
AzureIoTClient 42:448eecc3676e 436 /*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 437 LogError("unable to json_object_get_string(jsonObject, \"hostName\")");
AzureIoTClient 42:448eecc3676e 438 result = __LINE__;
AzureIoTClient 42:448eecc3676e 439 }
AzureIoTClient 42:448eecc3676e 440 else
AzureIoTClient 42:448eecc3676e 441 {
AzureIoTClient 42:448eecc3676e 442 const char* json_containerName = json_object_get_string(jsonObject, "containerName");
AzureIoTClient 42:448eecc3676e 443 if (json_containerName == NULL)
AzureIoTClient 42:448eecc3676e 444 {
AzureIoTClient 42:448eecc3676e 445 /*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 446 LogError("unable to json_object_get_string(jsonObject, \"containerName\")");
AzureIoTClient 42:448eecc3676e 447 result = __LINE__;
AzureIoTClient 42:448eecc3676e 448 }
AzureIoTClient 42:448eecc3676e 449 else
AzureIoTClient 42:448eecc3676e 450 {
AzureIoTClient 42:448eecc3676e 451 const char* json_blobName = json_object_get_string(jsonObject, "blobName");
AzureIoTClient 42:448eecc3676e 452 if (json_blobName == NULL)
AzureIoTClient 42:448eecc3676e 453 {
AzureIoTClient 42:448eecc3676e 454 /*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 455 LogError("unable to json_object_get_string(jsonObject, \"blobName\")");
AzureIoTClient 42:448eecc3676e 456 result = __LINE__;
AzureIoTClient 42:448eecc3676e 457 }
AzureIoTClient 42:448eecc3676e 458 else
AzureIoTClient 42:448eecc3676e 459 {
AzureIoTClient 42:448eecc3676e 460 const char* json_sasToken = json_object_get_string(jsonObject, "sasToken");
AzureIoTClient 42:448eecc3676e 461 if (json_sasToken == NULL)
AzureIoTClient 42:448eecc3676e 462 {
AzureIoTClient 42:448eecc3676e 463 /*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 464 LogError("unable to json_object_get_string(jsonObject, \"sasToken\")");
AzureIoTClient 42:448eecc3676e 465 result = __LINE__;
AzureIoTClient 42:448eecc3676e 466 }
AzureIoTClient 42:448eecc3676e 467 else
AzureIoTClient 42:448eecc3676e 468 {
AzureIoTClient 42:448eecc3676e 469 /*good JSON received from the service*/
AzureIoTClient 42:448eecc3676e 470
AzureIoTClient 42:448eecc3676e 471 if (STRING_copy(sasUri, "https://") != 0)
AzureIoTClient 42:448eecc3676e 472 {
AzureIoTClient 42:448eecc3676e 473 /*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 474 LogError("unable to STRING_copy");
AzureIoTClient 42:448eecc3676e 475 result = __LINE__;
AzureIoTClient 42:448eecc3676e 476 }
AzureIoTClient 42:448eecc3676e 477 else
AzureIoTClient 42:448eecc3676e 478 {
AzureIoTClient 42:448eecc3676e 479 if (!(
AzureIoTClient 42:448eecc3676e 480 (STRING_concat(sasUri, json_hostName) == 0) &&
AzureIoTClient 42:448eecc3676e 481 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 42:448eecc3676e 482 (STRING_concat(sasUri, json_containerName) == 0) &&
AzureIoTClient 42:448eecc3676e 483 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 42:448eecc3676e 484 (STRING_concat(sasUri, json_blobName) == 0) &&
AzureIoTClient 42:448eecc3676e 485 (STRING_concat(sasUri, json_sasToken) == 0)
AzureIoTClient 42:448eecc3676e 486 ))
AzureIoTClient 42:448eecc3676e 487 {
AzureIoTClient 42:448eecc3676e 488 /*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 489 LogError("unable to STRING_concat");
AzureIoTClient 42:448eecc3676e 490 result = __LINE__;
AzureIoTClient 42:448eecc3676e 491 }
AzureIoTClient 42:448eecc3676e 492 else
AzureIoTClient 42:448eecc3676e 493 {
AzureIoTClient 42:448eecc3676e 494 result = 0; /*success in step 1*/
AzureIoTClient 42:448eecc3676e 495 }
AzureIoTClient 42:448eecc3676e 496 }
AzureIoTClient 42:448eecc3676e 497 }
AzureIoTClient 42:448eecc3676e 498 }
AzureIoTClient 42:448eecc3676e 499 }
AzureIoTClient 42:448eecc3676e 500 }
AzureIoTClient 42:448eecc3676e 501 }
AzureIoTClient 42:448eecc3676e 502 }
AzureIoTClient 42:448eecc3676e 503 }
AzureIoTClient 42:448eecc3676e 504 json_value_free(allJson);
AzureIoTClient 42:448eecc3676e 505 }
AzureIoTClient 42:448eecc3676e 506 STRING_delete(responseAsString);
AzureIoTClient 42:448eecc3676e 507 }
AzureIoTClient 42:448eecc3676e 508 }
AzureIoTClient 42:448eecc3676e 509 }
AzureIoTClient 42:448eecc3676e 510 BUFFER_delete(responseContent);
AzureIoTClient 42:448eecc3676e 511 }
AzureIoTClient 42:448eecc3676e 512 }
AzureIoTClient 42:448eecc3676e 513 STRING_delete(relativePath);
AzureIoTClient 42:448eecc3676e 514 }
AzureIoTClient 42:448eecc3676e 515
AzureIoTClient 42:448eecc3676e 516 return result;
AzureIoTClient 42:448eecc3676e 517 }
AzureIoTClient 42:448eecc3676e 518
AzureIoTClient 42:448eecc3676e 519 /*returns 0 when the IoTHub has been informed about the file upload status*/
AzureIoTClient 42:448eecc3676e 520 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 521 {
AzureIoTClient 42:448eecc3676e 522 int result;
AzureIoTClient 42:448eecc3676e 523 /*here is step 3. depending on the outcome of step 2 it needs to inform IoTHub about the file upload status*/
AzureIoTClient 42:448eecc3676e 524 /*if step 1 failed, there's nothing that step 3 needs to report.*/
AzureIoTClient 42:448eecc3676e 525 /*this POST "tries" to happen*/
AzureIoTClient 42:448eecc3676e 526
AzureIoTClient 42:448eecc3676e 527 /*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 528 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 42:448eecc3676e 529 if (uriResource == NULL)
AzureIoTClient 42:448eecc3676e 530 {
AzureIoTClient 42:448eecc3676e 531 LogError("unable to construct URI");
AzureIoTClient 42:448eecc3676e 532 result = __LINE__;
AzureIoTClient 42:448eecc3676e 533 }
AzureIoTClient 42:448eecc3676e 534 else
AzureIoTClient 42:448eecc3676e 535 {
AzureIoTClient 42:448eecc3676e 536 if (!(
AzureIoTClient 42:448eecc3676e 537 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 42:448eecc3676e 538 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 539 (STRING_concat(uriResource, "/files/notifications") == 0)
AzureIoTClient 42:448eecc3676e 540 ))
AzureIoTClient 42:448eecc3676e 541 {
AzureIoTClient 42:448eecc3676e 542 LogError("unable to STRING_concat");
AzureIoTClient 42:448eecc3676e 543 result = __LINE__;
AzureIoTClient 42:448eecc3676e 544 }
AzureIoTClient 42:448eecc3676e 545 else
AzureIoTClient 42:448eecc3676e 546 {
AzureIoTClient 42:448eecc3676e 547 STRING_HANDLE relativePathNotification = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 548 if (relativePathNotification == NULL)
AzureIoTClient 42:448eecc3676e 549 {
AzureIoTClient 42:448eecc3676e 550 result = __LINE__;
AzureIoTClient 42:448eecc3676e 551 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 552 }
AzureIoTClient 42:448eecc3676e 553 else
AzureIoTClient 42:448eecc3676e 554 {
AzureIoTClient 42:448eecc3676e 555 if (!(
AzureIoTClient 42:448eecc3676e 556 (STRING_concat_with_STRING(relativePathNotification, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 557 (STRING_concat(relativePathNotification, "/files/notifications/") == 0) &&
AzureIoTClient 42:448eecc3676e 558 (STRING_concat(relativePathNotification, STRING_c_str(correlationId)) == 0) &&
AzureIoTClient 42:448eecc3676e 559 (STRING_concat(relativePathNotification, API_VERSION) == 0)
AzureIoTClient 42:448eecc3676e 560 ))
AzureIoTClient 42:448eecc3676e 561 {
AzureIoTClient 42:448eecc3676e 562 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 42:448eecc3676e 563 result = __LINE__;
AzureIoTClient 42:448eecc3676e 564 }
AzureIoTClient 42:448eecc3676e 565 else
AzureIoTClient 42:448eecc3676e 566 {
AzureIoTClient 42:448eecc3676e 567 /*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 568 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 569 {
AzureIoTClient 42:448eecc3676e 570 default:
AzureIoTClient 42:448eecc3676e 571 {
AzureIoTClient 42:448eecc3676e 572 LogError("internal error: unknown authorization Scheme");
AzureIoTClient 42:448eecc3676e 573 result = __LINE__;
AzureIoTClient 42:448eecc3676e 574 break;
AzureIoTClient 42:448eecc3676e 575 }
AzureIoTClient 46:6a69294b6119 576 case (X509):
AzureIoTClient 46:6a69294b6119 577 {
AzureIoTClient 46:6a69294b6119 578 unsigned int notificationStatusCode;
AzureIoTClient 46:6a69294b6119 579 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 46:6a69294b6119 580 iotHubHttpApiExHandle,
AzureIoTClient 46:6a69294b6119 581 HTTPAPI_REQUEST_POST,
AzureIoTClient 46:6a69294b6119 582 STRING_c_str(relativePathNotification),
AzureIoTClient 46:6a69294b6119 583 requestHttpHeaders,
AzureIoTClient 46:6a69294b6119 584 messageBody,
AzureIoTClient 46:6a69294b6119 585 &notificationStatusCode,
AzureIoTClient 46:6a69294b6119 586 NULL,
AzureIoTClient 46:6a69294b6119 587 NULL) != HTTPAPIEX_OK)
AzureIoTClient 46:6a69294b6119 588 {
AzureIoTClient 46:6a69294b6119 589 LogError("unable to do HTTPAPIEX_ExecuteRequest");
AzureIoTClient 46:6a69294b6119 590 result = __LINE__;
AzureIoTClient 46:6a69294b6119 591 }
AzureIoTClient 46:6a69294b6119 592 else
AzureIoTClient 46:6a69294b6119 593 {
AzureIoTClient 46:6a69294b6119 594 if (notificationStatusCode >= 300)
AzureIoTClient 46:6a69294b6119 595 {
AzureIoTClient 46:6a69294b6119 596 /*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 46:6a69294b6119 597 LogError("server didn't like the notification request");
AzureIoTClient 46:6a69294b6119 598 result = __LINE__;
AzureIoTClient 46:6a69294b6119 599 }
AzureIoTClient 46:6a69294b6119 600 else
AzureIoTClient 46:6a69294b6119 601 {
AzureIoTClient 46:6a69294b6119 602 result = 0;
AzureIoTClient 46:6a69294b6119 603 }
AzureIoTClient 46:6a69294b6119 604 }
AzureIoTClient 46:6a69294b6119 605 break;
AzureIoTClient 46:6a69294b6119 606 }
AzureIoTClient 42:448eecc3676e 607 case (DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 608 {
AzureIoTClient 42:448eecc3676e 609 STRING_HANDLE empty = STRING_new();
AzureIoTClient 42:448eecc3676e 610 if (empty == NULL)
AzureIoTClient 42:448eecc3676e 611 {
AzureIoTClient 42:448eecc3676e 612 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 613 result = __LINE__;
AzureIoTClient 42:448eecc3676e 614 }
AzureIoTClient 42:448eecc3676e 615 else
AzureIoTClient 42:448eecc3676e 616 {
AzureIoTClient 42:448eecc3676e 617 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 42:448eecc3676e 618 if (sasHandle == NULL)
AzureIoTClient 42:448eecc3676e 619 {
AzureIoTClient 42:448eecc3676e 620 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 42:448eecc3676e 621 result = __LINE__;
AzureIoTClient 42:448eecc3676e 622 }
AzureIoTClient 42:448eecc3676e 623 else
AzureIoTClient 42:448eecc3676e 624 {
AzureIoTClient 42:448eecc3676e 625 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 626 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 627 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 42:448eecc3676e 628 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 42:448eecc3676e 629 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 630 STRING_c_str(relativePathNotification), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 631 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 632 messageBody, /*BUFFER_HANDLE requestContent*/
AzureIoTClient 42:448eecc3676e 633 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 634 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 42:448eecc3676e 635 NULL
AzureIoTClient 42:448eecc3676e 636 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 637 {
AzureIoTClient 42:448eecc3676e 638 /*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 639 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 640 result = __LINE__;
AzureIoTClient 42:448eecc3676e 641 ;
AzureIoTClient 42:448eecc3676e 642 }
AzureIoTClient 42:448eecc3676e 643 else
AzureIoTClient 42:448eecc3676e 644 {
AzureIoTClient 42:448eecc3676e 645 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 646 {
AzureIoTClient 42:448eecc3676e 647 /*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 648 result = __LINE__;
AzureIoTClient 42:448eecc3676e 649 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 650 }
AzureIoTClient 42:448eecc3676e 651 else
AzureIoTClient 42:448eecc3676e 652 {
AzureIoTClient 42:448eecc3676e 653 result = 0;
AzureIoTClient 42:448eecc3676e 654 }
AzureIoTClient 42:448eecc3676e 655 }
AzureIoTClient 42:448eecc3676e 656 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 42:448eecc3676e 657 }
AzureIoTClient 42:448eecc3676e 658 STRING_delete(empty);
AzureIoTClient 42:448eecc3676e 659 }
AzureIoTClient 42:448eecc3676e 660 break;
AzureIoTClient 42:448eecc3676e 661 }
AzureIoTClient 42:448eecc3676e 662 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 663 {
AzureIoTClient 42:448eecc3676e 664 unsigned int notificationStatusCode;
AzureIoTClient 42:448eecc3676e 665 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 666 iotHubHttpApiExHandle,
AzureIoTClient 42:448eecc3676e 667 HTTPAPI_REQUEST_POST,
AzureIoTClient 42:448eecc3676e 668 STRING_c_str(relativePathNotification),
AzureIoTClient 42:448eecc3676e 669 requestHttpHeaders,
AzureIoTClient 42:448eecc3676e 670 messageBody,
AzureIoTClient 42:448eecc3676e 671 &notificationStatusCode,
AzureIoTClient 42:448eecc3676e 672 NULL,
AzureIoTClient 42:448eecc3676e 673 NULL) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 674 {
AzureIoTClient 42:448eecc3676e 675 LogError("unable to do HTTPAPIEX_ExecuteRequest");
AzureIoTClient 42:448eecc3676e 676 result = __LINE__;
AzureIoTClient 42:448eecc3676e 677 }
AzureIoTClient 42:448eecc3676e 678 else
AzureIoTClient 42:448eecc3676e 679 {
AzureIoTClient 42:448eecc3676e 680 if (notificationStatusCode >= 300)
AzureIoTClient 42:448eecc3676e 681 {
AzureIoTClient 42:448eecc3676e 682 /*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 683 LogError("server didn't like the notification request");
AzureIoTClient 42:448eecc3676e 684 result = __LINE__;
AzureIoTClient 42:448eecc3676e 685 }
AzureIoTClient 42:448eecc3676e 686 else
AzureIoTClient 42:448eecc3676e 687 {
AzureIoTClient 42:448eecc3676e 688 result = 0;
AzureIoTClient 42:448eecc3676e 689 }
AzureIoTClient 42:448eecc3676e 690 }
AzureIoTClient 42:448eecc3676e 691 break;
AzureIoTClient 42:448eecc3676e 692 }
AzureIoTClient 42:448eecc3676e 693 } /*switch authorizationScheme*/
AzureIoTClient 42:448eecc3676e 694 }
AzureIoTClient 42:448eecc3676e 695 STRING_delete(relativePathNotification);
AzureIoTClient 42:448eecc3676e 696 }
AzureIoTClient 42:448eecc3676e 697 }
AzureIoTClient 42:448eecc3676e 698 STRING_delete(uriResource);
AzureIoTClient 42:448eecc3676e 699 }
AzureIoTClient 42:448eecc3676e 700 return result;
AzureIoTClient 42:448eecc3676e 701 }
AzureIoTClient 42:448eecc3676e 702
AzureIoTClient 42:448eecc3676e 703 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 704 {
AzureIoTClient 42:448eecc3676e 705 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 48:cc5d91f2b06d 706 BUFFER_HANDLE toBeTransmitted;
AzureIoTClient 48:cc5d91f2b06d 707 int requiredStringLength;
AzureIoTClient 48:cc5d91f2b06d 708 char* requiredString;
AzureIoTClient 42:448eecc3676e 709
AzureIoTClient 42:448eecc3676e 710 /*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 711 /*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 712 /*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 713 if (
AzureIoTClient 42:448eecc3676e 714 (handle == NULL) ||
AzureIoTClient 42:448eecc3676e 715 (destinationFileName == NULL) ||
Azure.IoT Build 45:54c11b1b1407 716 ((source == NULL) && (size > 0))
AzureIoTClient 42:448eecc3676e 717 )
AzureIoTClient 42:448eecc3676e 718 {
AzureIoTClient 42:448eecc3676e 719 LogError("invalid argument detected handle=%p destinationFileName=%p source=%p size=%zu", handle, destinationFileName, source, size);
AzureIoTClient 42:448eecc3676e 720 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 42:448eecc3676e 721 }
AzureIoTClient 42:448eecc3676e 722 else
AzureIoTClient 42:448eecc3676e 723 {
AzureIoTClient 42:448eecc3676e 724 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 725
AzureIoTClient 42:448eecc3676e 726 /*Codes_SRS_IOTHUBCLIENT_LL_02_064: [ IoTHubClient_LL_UploadToBlob shall create an HTTPAPIEX_HANDLE to the IoTHub hostname. ]*/
AzureIoTClient 42:448eecc3676e 727 HTTPAPIEX_HANDLE iotHubHttpApiExHandle = HTTPAPIEX_Create(handleData->hostname);
AzureIoTClient 42:448eecc3676e 728
AzureIoTClient 42:448eecc3676e 729 /*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 730 if (iotHubHttpApiExHandle == NULL)
AzureIoTClient 42:448eecc3676e 731 {
AzureIoTClient 42:448eecc3676e 732 LogError("unable to HTTPAPIEX_Create");
AzureIoTClient 42:448eecc3676e 733 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 734 }
AzureIoTClient 42:448eecc3676e 735 else
AzureIoTClient 42:448eecc3676e 736 {
AzureIoTClient 46:6a69294b6119 737 if (
AzureIoTClient 46:6a69294b6119 738 (handleData->authorizationScheme == X509) &&
AzureIoTClient 46:6a69294b6119 739
AzureIoTClient 46:6a69294b6119 740 /*transmit the x509certificate and x509privatekey*/
AzureIoTClient 46:6a69294b6119 741 /*Codes_SRS_IOTHUBCLIENT_LL_02_106: [ - x509certificate and x509privatekey saved options shall be passed on the HTTPAPIEX_SetOption ]*/
AzureIoTClient 46:6a69294b6119 742 (!(
AzureIoTClient 48:cc5d91f2b06d 743 (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, OPTION_X509_CERT, handleData->credentials.x509credentials.x509certificate) == HTTPAPIEX_OK) &&
AzureIoTClient 48:cc5d91f2b06d 744 (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, OPTION_X509_PRIVATE_KEY, handleData->credentials.x509credentials.x509privatekey) == HTTPAPIEX_OK)
AzureIoTClient 46:6a69294b6119 745 ))
AzureIoTClient 46:6a69294b6119 746 )
AzureIoTClient 42:448eecc3676e 747 {
AzureIoTClient 46:6a69294b6119 748 LogError("unable to HTTPAPIEX_SetOption for x509");
AzureIoTClient 42:448eecc3676e 749 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 750 }
AzureIoTClient 42:448eecc3676e 751 else
AzureIoTClient 42:448eecc3676e 752 {
AzureIoTClient 46:6a69294b6119 753
AzureIoTClient 46:6a69294b6119 754 STRING_HANDLE correlationId = STRING_new();
AzureIoTClient 46:6a69294b6119 755 if (correlationId == NULL)
AzureIoTClient 42:448eecc3676e 756 {
AzureIoTClient 42:448eecc3676e 757 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 758 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 759 }
AzureIoTClient 42:448eecc3676e 760 else
AzureIoTClient 42:448eecc3676e 761 {
AzureIoTClient 46:6a69294b6119 762 STRING_HANDLE sasUri = STRING_new();
AzureIoTClient 46:6a69294b6119 763 if (sasUri == NULL)
AzureIoTClient 42:448eecc3676e 764 {
AzureIoTClient 46:6a69294b6119 765 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 766 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 767 }
AzureIoTClient 42:448eecc3676e 768 else
AzureIoTClient 42:448eecc3676e 769 {
AzureIoTClient 46:6a69294b6119 770 /*Codes_SRS_IOTHUBCLIENT_LL_02_070: [ IoTHubClient_LL_UploadToBlob shall create request HTTP headers. ]*/
AzureIoTClient 46:6a69294b6119 771 HTTP_HEADERS_HANDLE requestHttpHeaders = HTTPHeaders_Alloc(); /*these are build by step 1 and used by step 3 too*/
AzureIoTClient 46:6a69294b6119 772 if (requestHttpHeaders == NULL)
AzureIoTClient 42:448eecc3676e 773 {
AzureIoTClient 46:6a69294b6119 774 LogError("unable to HTTPHeaders_Alloc");
AzureIoTClient 42:448eecc3676e 775 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 776 }
AzureIoTClient 42:448eecc3676e 777 else
AzureIoTClient 42:448eecc3676e 778 {
AzureIoTClient 46:6a69294b6119 779 /*do step 1*/
AzureIoTClient 46:6a69294b6119 780 if (IoTHubClient_LL_UploadToBlob_step1and2(handleData, iotHubHttpApiExHandle, requestHttpHeaders, destinationFileName, correlationId, sasUri) != 0)
AzureIoTClient 42:448eecc3676e 781 {
AzureIoTClient 46:6a69294b6119 782 LogError("error in IoTHubClient_LL_UploadToBlob_step1");
AzureIoTClient 42:448eecc3676e 783 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 784 }
AzureIoTClient 42:448eecc3676e 785 else
AzureIoTClient 42:448eecc3676e 786 {
AzureIoTClient 46:6a69294b6119 787 /*do step 2.*/
AzureIoTClient 42:448eecc3676e 788
AzureIoTClient 46:6a69294b6119 789 unsigned int httpResponse;
AzureIoTClient 46:6a69294b6119 790 BUFFER_HANDLE responseToIoTHub = BUFFER_new();
AzureIoTClient 46:6a69294b6119 791 if (responseToIoTHub == NULL)
AzureIoTClient 46:6a69294b6119 792 {
AzureIoTClient 42:448eecc3676e 793 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 794 LogError("unable to BUFFER_new");
AzureIoTClient 42:448eecc3676e 795 }
AzureIoTClient 42:448eecc3676e 796 else
AzureIoTClient 42:448eecc3676e 797 {
AzureIoTClient 46:6a69294b6119 798 int step2success;
AzureIoTClient 46:6a69294b6119 799 /*Codes_SRS_IOTHUBCLIENT_LL_02_083: [ IoTHubClient_LL_UploadToBlob shall call Blob_UploadFromSasUri and capture the HTTP return code and HTTP body. ]*/
AzureIoTClient 46:6a69294b6119 800 step2success = (Blob_UploadFromSasUri(STRING_c_str(sasUri), source, size, &httpResponse, responseToIoTHub) == BLOB_OK);
AzureIoTClient 46:6a69294b6119 801 if (!step2success)
AzureIoTClient 46:6a69294b6119 802 {
AzureIoTClient 46:6a69294b6119 803 /*Codes_SRS_IOTHUBCLIENT_LL_02_084: [ If Blob_UploadFromSasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 804 LogError("unable to Blob_UploadFromSasUri");
AzureIoTClient 42:448eecc3676e 805
AzureIoTClient 46:6a69294b6119 806 /*do step 3*/ /*try*/
AzureIoTClient 46:6a69294b6119 807 /*Codes_SRS_IOTHUBCLIENT_LL_02_091: [ If step 2 fails without establishing an HTTP dialogue, then the HTTP message body shall look like: ]*/
AzureIoTClient 46:6a69294b6119 808 if (BUFFER_build(responseToIoTHub, (const unsigned char*)FILE_UPLOAD_FAILED_BODY, sizeof(FILE_UPLOAD_FAILED_BODY) / sizeof(FILE_UPLOAD_FAILED_BODY[0])) == 0)
AzureIoTClient 46:6a69294b6119 809 {
AzureIoTClient 46:6a69294b6119 810 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, responseToIoTHub) != 0)
AzureIoTClient 46:6a69294b6119 811 {
AzureIoTClient 46:6a69294b6119 812 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 46:6a69294b6119 813 }
AzureIoTClient 46:6a69294b6119 814 }
AzureIoTClient 42:448eecc3676e 815 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 816 }
AzureIoTClient 42:448eecc3676e 817 else
AzureIoTClient 42:448eecc3676e 818 {
AzureIoTClient 46:6a69294b6119 819 /*must make a json*/
AzureIoTClient 46:6a69294b6119 820
AzureIoTClient 47:aaa262b5f898 821 requiredStringLength = snprintf(NULL, 0, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 46:6a69294b6119 822
AzureIoTClient 47:aaa262b5f898 823 requiredString = malloc(requiredStringLength + 1);
AzureIoTClient 46:6a69294b6119 824 if (requiredString == 0)
AzureIoTClient 42:448eecc3676e 825 {
AzureIoTClient 46:6a69294b6119 826 LogError("unable to malloc");
AzureIoTClient 42:448eecc3676e 827 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 828 }
AzureIoTClient 42:448eecc3676e 829 else
AzureIoTClient 42:448eecc3676e 830 {
AzureIoTClient 46:6a69294b6119 831 /*do again snprintf*/
AzureIoTClient 46:6a69294b6119 832 (void)snprintf(requiredString, requiredStringLength + 1, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 47:aaa262b5f898 833 toBeTransmitted = BUFFER_create((const unsigned char*)requiredString, requiredStringLength);
AzureIoTClient 46:6a69294b6119 834 if (toBeTransmitted == NULL)
AzureIoTClient 42:448eecc3676e 835 {
AzureIoTClient 46:6a69294b6119 836 LogError("unable to BUFFER_create");
AzureIoTClient 42:448eecc3676e 837 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 838 }
AzureIoTClient 42:448eecc3676e 839 else
AzureIoTClient 42:448eecc3676e 840 {
AzureIoTClient 46:6a69294b6119 841 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, toBeTransmitted) != 0)
AzureIoTClient 46:6a69294b6119 842 {
AzureIoTClient 46:6a69294b6119 843 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 46:6a69294b6119 844 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 845 }
AzureIoTClient 46:6a69294b6119 846 else
AzureIoTClient 46:6a69294b6119 847 {
AzureIoTClient 46:6a69294b6119 848 result = (httpResponse < 300) ? IOTHUB_CLIENT_OK : IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 849 }
AzureIoTClient 46:6a69294b6119 850 BUFFER_delete(toBeTransmitted);
AzureIoTClient 42:448eecc3676e 851 }
AzureIoTClient 46:6a69294b6119 852 free(requiredString);
AzureIoTClient 42:448eecc3676e 853 }
AzureIoTClient 42:448eecc3676e 854 }
AzureIoTClient 46:6a69294b6119 855 BUFFER_delete(responseToIoTHub);
AzureIoTClient 42:448eecc3676e 856 }
AzureIoTClient 42:448eecc3676e 857 }
AzureIoTClient 46:6a69294b6119 858 HTTPHeaders_Free(requestHttpHeaders);
AzureIoTClient 42:448eecc3676e 859 }
AzureIoTClient 46:6a69294b6119 860 STRING_delete(sasUri);
AzureIoTClient 42:448eecc3676e 861 }
AzureIoTClient 46:6a69294b6119 862 STRING_delete(correlationId);
AzureIoTClient 42:448eecc3676e 863 }
AzureIoTClient 42:448eecc3676e 864 }
AzureIoTClient 42:448eecc3676e 865 HTTPAPIEX_Destroy(iotHubHttpApiExHandle);
AzureIoTClient 42:448eecc3676e 866 }
AzureIoTClient 42:448eecc3676e 867 }
AzureIoTClient 42:448eecc3676e 868 return result;
AzureIoTClient 42:448eecc3676e 869 }
AzureIoTClient 42:448eecc3676e 870
AzureIoTClient 42:448eecc3676e 871 void IoTHubClient_LL_UploadToBlob_Destroy(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle)
AzureIoTClient 42:448eecc3676e 872 {
AzureIoTClient 42:448eecc3676e 873 if (handle == NULL)
AzureIoTClient 42:448eecc3676e 874 {
AzureIoTClient 42:448eecc3676e 875 LogError("unexepected NULL argument");
AzureIoTClient 42:448eecc3676e 876 }
AzureIoTClient 42:448eecc3676e 877 else
AzureIoTClient 42:448eecc3676e 878 {
AzureIoTClient 42:448eecc3676e 879 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 880 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 881 {
AzureIoTClient 42:448eecc3676e 882 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 883 {
AzureIoTClient 42:448eecc3676e 884 STRING_delete(handleData->credentials.sas);
AzureIoTClient 42:448eecc3676e 885 break;
AzureIoTClient 42:448eecc3676e 886 }
AzureIoTClient 42:448eecc3676e 887 case(DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 888 {
AzureIoTClient 42:448eecc3676e 889 STRING_delete(handleData->credentials.deviceKey);
AzureIoTClient 42:448eecc3676e 890 break;
AzureIoTClient 42:448eecc3676e 891 }
AzureIoTClient 46:6a69294b6119 892 case(X509):
AzureIoTClient 46:6a69294b6119 893 {
AzureIoTClient 46:6a69294b6119 894 if (handleData->credentials.x509credentials.x509certificate != NULL)
AzureIoTClient 46:6a69294b6119 895 {
AzureIoTClient 46:6a69294b6119 896 free((void*)handleData->credentials.x509credentials.x509certificate);
AzureIoTClient 46:6a69294b6119 897 }
AzureIoTClient 46:6a69294b6119 898 if (handleData->credentials.x509credentials.x509privatekey != NULL)
AzureIoTClient 46:6a69294b6119 899 {
AzureIoTClient 46:6a69294b6119 900 free((void*)handleData->credentials.x509credentials.x509privatekey);
AzureIoTClient 46:6a69294b6119 901 }
AzureIoTClient 46:6a69294b6119 902 break;
AzureIoTClient 46:6a69294b6119 903 }
AzureIoTClient 42:448eecc3676e 904 default:
AzureIoTClient 42:448eecc3676e 905 {
AzureIoTClient 42:448eecc3676e 906 LogError("INTERNAL ERROR");
AzureIoTClient 42:448eecc3676e 907 break;
AzureIoTClient 42:448eecc3676e 908 }
AzureIoTClient 42:448eecc3676e 909 }
AzureIoTClient 42:448eecc3676e 910 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 911 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 912 free(handleData);
AzureIoTClient 42:448eecc3676e 913 }
AzureIoTClient 42:448eecc3676e 914 }
AzureIoTClient 46:6a69294b6119 915
AzureIoTClient 46:6a69294b6119 916 IOTHUB_CLIENT_RESULT IoTHubClient_LL_UploadToBlob_SetOption(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle, const char* optionName, const void* value)
AzureIoTClient 46:6a69294b6119 917 {
AzureIoTClient 46:6a69294b6119 918 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 46:6a69294b6119 919 /*Codes_SRS_IOTHUBCLIENT_LL_02_110: [ If parameter handle is NULL then IoTHubClient_LL_UploadToBlob_SetOption shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 920 if (handle == NULL)
AzureIoTClient 46:6a69294b6119 921 {
AzureIoTClient 46:6a69294b6119 922 LogError("invalid argument detected: IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle=%p, const char* optionName=%s, const void* value=%p", handle, optionName, value);
AzureIoTClient 46:6a69294b6119 923 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 924 }
AzureIoTClient 46:6a69294b6119 925 else
AzureIoTClient 46:6a69294b6119 926 {
AzureIoTClient 46:6a69294b6119 927 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 46:6a69294b6119 928
AzureIoTClient 46:6a69294b6119 929 /*Codes_SRS_IOTHUBCLIENT_LL_02_100: [ x509certificate - then value then is a null terminated string that contains the x509 certificate. ]*/
AzureIoTClient 48:cc5d91f2b06d 930 if (strcmp(optionName, OPTION_X509_CERT) == 0)
AzureIoTClient 46:6a69294b6119 931 {
AzureIoTClient 46:6a69294b6119 932 /*Codes_SRS_IOTHUBCLIENT_LL_02_109: [ If the authentication scheme is NOT x509 then IoTHubClient_LL_UploadToBlob_SetOption shall return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 46:6a69294b6119 933 if (handleData->authorizationScheme != X509)
AzureIoTClient 46:6a69294b6119 934 {
AzureIoTClient 46:6a69294b6119 935 LogError("trying to set a x509 certificate while the authentication scheme is not x509");
AzureIoTClient 46:6a69294b6119 936 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 937 }
AzureIoTClient 46:6a69294b6119 938 else
AzureIoTClient 46:6a69294b6119 939 {
AzureIoTClient 46:6a69294b6119 940 /*Codes_SRS_IOTHUBCLIENT_LL_02_103: [ The options shall be saved. ]*/
AzureIoTClient 46:6a69294b6119 941 /*try to make a copy of the certificate*/
AzureIoTClient 46:6a69294b6119 942 char* temp;
AzureIoTClient 46:6a69294b6119 943 if (mallocAndStrcpy_s(&temp, value) != 0)
AzureIoTClient 46:6a69294b6119 944 {
AzureIoTClient 46:6a69294b6119 945 /*Codes_SRS_IOTHUBCLIENT_LL_02_104: [ If saving fails, then IoTHubClient_LL_UploadToBlob_SetOption shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 946 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 46:6a69294b6119 947 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 948 }
AzureIoTClient 46:6a69294b6119 949 else
AzureIoTClient 46:6a69294b6119 950 {
AzureIoTClient 46:6a69294b6119 951 /*Codes_SRS_IOTHUBCLIENT_LL_02_105: [ Otherwise IoTHubClient_LL_UploadToBlob_SetOption shall succeed and return IOTHUB_CLIENT_OK. ]*/
AzureIoTClient 46:6a69294b6119 952 if (handleData->credentials.x509credentials.x509certificate != NULL) /*free any previous values, if any*/
AzureIoTClient 46:6a69294b6119 953 {
AzureIoTClient 46:6a69294b6119 954 free((void*)handleData->credentials.x509credentials.x509certificate);
AzureIoTClient 46:6a69294b6119 955 }
AzureIoTClient 46:6a69294b6119 956 handleData->credentials.x509credentials.x509certificate = temp;
AzureIoTClient 46:6a69294b6119 957 result = IOTHUB_CLIENT_OK;
AzureIoTClient 46:6a69294b6119 958 }
AzureIoTClient 46:6a69294b6119 959 }
AzureIoTClient 46:6a69294b6119 960 }
AzureIoTClient 46:6a69294b6119 961 /*Codes_SRS_IOTHUBCLIENT_LL_02_101: [ x509privatekey - then value is a null terminated string that contains the x509 privatekey. ]*/
AzureIoTClient 48:cc5d91f2b06d 962 else if (strcmp(optionName, OPTION_X509_PRIVATE_KEY) == 0)
AzureIoTClient 46:6a69294b6119 963 {
AzureIoTClient 46:6a69294b6119 964 /*Codes_SRS_IOTHUBCLIENT_LL_02_109: [ If the authentication scheme is NOT x509 then IoTHubClient_LL_UploadToBlob_SetOption shall return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 46:6a69294b6119 965 if (handleData->authorizationScheme != X509)
AzureIoTClient 46:6a69294b6119 966 {
AzureIoTClient 46:6a69294b6119 967 LogError("trying to set a x509 privatekey while the authentication scheme is not x509");
AzureIoTClient 46:6a69294b6119 968 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 969 }
AzureIoTClient 46:6a69294b6119 970 else
AzureIoTClient 46:6a69294b6119 971 {
AzureIoTClient 46:6a69294b6119 972 /*Codes_SRS_IOTHUBCLIENT_LL_02_103: [ The options shall be saved. ]*/
AzureIoTClient 46:6a69294b6119 973 /*try to make a copy of the privatekey*/
AzureIoTClient 46:6a69294b6119 974 char* temp;
AzureIoTClient 46:6a69294b6119 975 if (mallocAndStrcpy_s(&temp, value) != 0)
AzureIoTClient 46:6a69294b6119 976 {
AzureIoTClient 46:6a69294b6119 977 /*Codes_SRS_IOTHUBCLIENT_LL_02_104: [ If saving fails, then IoTHubClient_LL_UploadToBlob_SetOption shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 978 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 46:6a69294b6119 979 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 980 }
AzureIoTClient 46:6a69294b6119 981 else
AzureIoTClient 46:6a69294b6119 982 {
AzureIoTClient 46:6a69294b6119 983 /*Codes_SRS_IOTHUBCLIENT_LL_02_105: [ Otherwise IoTHubClient_LL_UploadToBlob_SetOption shall succeed and return IOTHUB_CLIENT_OK. ]*/
AzureIoTClient 46:6a69294b6119 984 if (handleData->credentials.x509credentials.x509privatekey != NULL) /*free any previous values, if any*/
AzureIoTClient 46:6a69294b6119 985 {
AzureIoTClient 46:6a69294b6119 986 free((void*)handleData->credentials.x509credentials.x509privatekey);
AzureIoTClient 46:6a69294b6119 987 }
AzureIoTClient 46:6a69294b6119 988 handleData->credentials.x509credentials.x509privatekey = temp;
AzureIoTClient 46:6a69294b6119 989 result = IOTHUB_CLIENT_OK;
AzureIoTClient 46:6a69294b6119 990 }
AzureIoTClient 46:6a69294b6119 991 }
AzureIoTClient 46:6a69294b6119 992 }
AzureIoTClient 46:6a69294b6119 993 else
AzureIoTClient 46:6a69294b6119 994 {
AzureIoTClient 46:6a69294b6119 995 /*Codes_SRS_IOTHUBCLIENT_LL_02_102: [ If an unknown option is presented then IoTHubClient_LL_UploadToBlob_SetOption shall return IOTHUB_CLIENT_INVALID_ARG. ]*/
AzureIoTClient 46:6a69294b6119 996 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 997 }
AzureIoTClient 46:6a69294b6119 998 }
AzureIoTClient 46:6a69294b6119 999 return result;
AzureIoTClient 46:6a69294b6119 1000 }
AzureIoTClient 46:6a69294b6119 1001
AzureIoTClient 46:6a69294b6119 1002
Azure.IoT Build 45:54c11b1b1407 1003 #endif /*DONT_USE_UPLOADTOBLOB*/
AzureIoTClient 46:6a69294b6119 1004
AzureIoTClient 46:6a69294b6119 1005