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:
Sat Oct 21 20:11:49 2017 +0000
Revision:
77:e4e36df9caee
Parent:
75:86205ca63a59
Child:
79:bb88037c05e6
1.1.26

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 #include <string.h>
AzureIoTClient 60:41648c4e7036 10 #include "azure_c_shared_utility/optimize_size.h"
AzureIoTClient 42:448eecc3676e 11 #include "azure_c_shared_utility/gballoc.h"
AzureIoTClient 42:448eecc3676e 12 #include "azure_c_shared_utility/string_tokenizer.h"
AzureIoTClient 42:448eecc3676e 13 #include "azure_c_shared_utility/doublylinkedlist.h"
Azure.IoT Build 45:54c11b1b1407 14 #include "azure_c_shared_utility/xlogging.h"
AzureIoTClient 42:448eecc3676e 15 #include "azure_c_shared_utility/tickcounter.h"
AzureIoTClient 42:448eecc3676e 16 #include "azure_c_shared_utility/httpapiexsas.h"
AzureIoTClient 74:ea0021abecf7 17 #include "azure_c_shared_utility/shared_util_options.h"
AzureIoTClient 77:e4e36df9caee 18 #include "azure_c_shared_utility/urlencode.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 62:5a4cdacf5090 70 char* certificates; /*if there are any certificates used*/
AzureIoTClient 74:ea0021abecf7 71 HTTP_PROXY_OPTIONS http_proxy_options;
AzureIoTClient 42:448eecc3676e 72 }IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA;
AzureIoTClient 42:448eecc3676e 73
AzureIoTClient 42:448eecc3676e 74 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE IoTHubClient_LL_UploadToBlob_Create(const IOTHUB_CLIENT_CONFIG* config)
AzureIoTClient 42:448eecc3676e 75 {
AzureIoTClient 42:448eecc3676e 76 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = malloc(sizeof(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA));
AzureIoTClient 42:448eecc3676e 77 if (handleData == NULL)
AzureIoTClient 42:448eecc3676e 78 {
AzureIoTClient 42:448eecc3676e 79 LogError("oom - malloc");
AzureIoTClient 42:448eecc3676e 80 /*return as is*/
AzureIoTClient 42:448eecc3676e 81 }
AzureIoTClient 42:448eecc3676e 82 else
AzureIoTClient 42:448eecc3676e 83 {
AzureIoTClient 42:448eecc3676e 84 size_t iotHubNameLength = strlen(config->iotHubName);
AzureIoTClient 42:448eecc3676e 85 size_t iotHubSuffixLength = strlen(config->iotHubSuffix);
AzureIoTClient 42:448eecc3676e 86 handleData->deviceId = STRING_construct(config->deviceId);
AzureIoTClient 42:448eecc3676e 87 if (handleData->deviceId == NULL)
AzureIoTClient 42:448eecc3676e 88 {
AzureIoTClient 42:448eecc3676e 89 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 90 free(handleData);
AzureIoTClient 42:448eecc3676e 91 handleData = NULL;
AzureIoTClient 42:448eecc3676e 92 }
AzureIoTClient 42:448eecc3676e 93 else
AzureIoTClient 42:448eecc3676e 94 {
AzureIoTClient 42:448eecc3676e 95 handleData->hostname = malloc(iotHubNameLength + 1 + iotHubSuffixLength + 1); /*first +1 is because "." the second +1 is because \0*/
AzureIoTClient 42:448eecc3676e 96 if (handleData->hostname == NULL)
AzureIoTClient 42:448eecc3676e 97 {
AzureIoTClient 42:448eecc3676e 98 LogError("malloc failed");
AzureIoTClient 42:448eecc3676e 99 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 100 free(handleData);
AzureIoTClient 42:448eecc3676e 101 handleData = NULL;
AzureIoTClient 42:448eecc3676e 102 }
AzureIoTClient 42:448eecc3676e 103 else
AzureIoTClient 42:448eecc3676e 104 {
AzureIoTClient 75:86205ca63a59 105 char* insert_pos = (char*)handleData->hostname;
AzureIoTClient 75:86205ca63a59 106 (void)memcpy((char*)insert_pos, config->iotHubName, iotHubNameLength);
AzureIoTClient 75:86205ca63a59 107 insert_pos += iotHubNameLength;
AzureIoTClient 75:86205ca63a59 108 *insert_pos = '.';
AzureIoTClient 75:86205ca63a59 109 insert_pos += 1;
AzureIoTClient 75:86205ca63a59 110 (void)memcpy(insert_pos, config->iotHubSuffix, iotHubSuffixLength); /*+1 will copy the \0 too*/
AzureIoTClient 75:86205ca63a59 111 insert_pos += iotHubSuffixLength;
AzureIoTClient 75:86205ca63a59 112 *insert_pos = '\0';
AzureIoTClient 75:86205ca63a59 113
AzureIoTClient 62:5a4cdacf5090 114 handleData->certificates = NULL;
AzureIoTClient 74:ea0021abecf7 115 memset(&(handleData->http_proxy_options), 0, sizeof(HTTP_PROXY_OPTIONS));
AzureIoTClient 74:ea0021abecf7 116
AzureIoTClient 46:6a69294b6119 117 if ((config->deviceSasToken != NULL) && (config->deviceKey == NULL))
AzureIoTClient 42:448eecc3676e 118 {
AzureIoTClient 42:448eecc3676e 119 handleData->authorizationScheme = SAS_TOKEN;
AzureIoTClient 42:448eecc3676e 120 handleData->credentials.sas = STRING_construct(config->deviceSasToken);
AzureIoTClient 42:448eecc3676e 121 if (handleData->credentials.sas == NULL)
AzureIoTClient 42:448eecc3676e 122 {
AzureIoTClient 42:448eecc3676e 123 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 124 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 125 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 126 free(handleData);
AzureIoTClient 42:448eecc3676e 127 handleData = NULL;
AzureIoTClient 42:448eecc3676e 128 }
AzureIoTClient 42:448eecc3676e 129 else
AzureIoTClient 42:448eecc3676e 130 {
AzureIoTClient 42:448eecc3676e 131 /*return as is*/
AzureIoTClient 42:448eecc3676e 132 }
AzureIoTClient 42:448eecc3676e 133 }
AzureIoTClient 46:6a69294b6119 134 else if ((config->deviceSasToken == NULL) && (config->deviceKey != NULL))
AzureIoTClient 42:448eecc3676e 135 {
AzureIoTClient 42:448eecc3676e 136 handleData->authorizationScheme = DEVICE_KEY;
AzureIoTClient 42:448eecc3676e 137 handleData->credentials.deviceKey = STRING_construct(config->deviceKey);
AzureIoTClient 42:448eecc3676e 138 if (handleData->credentials.deviceKey == NULL)
AzureIoTClient 42:448eecc3676e 139 {
AzureIoTClient 42:448eecc3676e 140 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 141 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 142 STRING_delete(handleData->deviceId);
AzureIoTClient 42:448eecc3676e 143 free(handleData);
AzureIoTClient 42:448eecc3676e 144 handleData = NULL;
AzureIoTClient 42:448eecc3676e 145 }
AzureIoTClient 42:448eecc3676e 146 else
AzureIoTClient 42:448eecc3676e 147 {
AzureIoTClient 42:448eecc3676e 148 /*return as is*/
AzureIoTClient 42:448eecc3676e 149 }
AzureIoTClient 42:448eecc3676e 150 }
AzureIoTClient 46:6a69294b6119 151 else if ((config->deviceSasToken == NULL) && (config->deviceKey == NULL))
AzureIoTClient 46:6a69294b6119 152 {
AzureIoTClient 46:6a69294b6119 153 handleData->authorizationScheme = X509;
AzureIoTClient 46:6a69294b6119 154 handleData->credentials.x509credentials.x509certificate = NULL;
AzureIoTClient 46:6a69294b6119 155 handleData->credentials.x509credentials.x509privatekey = NULL;
AzureIoTClient 46:6a69294b6119 156 /*return as is*/
AzureIoTClient 46:6a69294b6119 157 }
AzureIoTClient 42:448eecc3676e 158 }
AzureIoTClient 42:448eecc3676e 159 }
AzureIoTClient 42:448eecc3676e 160 }
AzureIoTClient 42:448eecc3676e 161 return (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE)handleData;
AzureIoTClient 42:448eecc3676e 162
AzureIoTClient 42:448eecc3676e 163 }
AzureIoTClient 42:448eecc3676e 164
AzureIoTClient 42:448eecc3676e 165 /*returns 0 when correlationId, sasUri contain data*/
AzureIoTClient 42:448eecc3676e 166 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 167 STRING_HANDLE correlationId, STRING_HANDLE sasUri)
AzureIoTClient 42:448eecc3676e 168 {
AzureIoTClient 42:448eecc3676e 169 int result;
AzureIoTClient 42:448eecc3676e 170
AzureIoTClient 69:b6f532f8c608 171 /*Codes_SRS_IOTHUBCLIENT_LL_02_066: [ IoTHubClient_LL_UploadToBlob shall create an HTTP relative path formed from "/devices/" + deviceId + "/files/" + "?api-version=API_VERSION". ]*/
AzureIoTClient 42:448eecc3676e 172 STRING_HANDLE relativePath = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 173 if (relativePath == NULL)
AzureIoTClient 42:448eecc3676e 174 {
AzureIoTClient 42:448eecc3676e 175 /*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 176 LogError("unable to STRING_construct");
AzureIoTClient 60:41648c4e7036 177 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 178 }
AzureIoTClient 74:ea0021abecf7 179 else
AzureIoTClient 74:ea0021abecf7 180 {
AzureIoTClient 74:ea0021abecf7 181 if (!(
AzureIoTClient 74:ea0021abecf7 182 (STRING_concat_with_STRING(relativePath, handleData->deviceId) == 0) &&
AzureIoTClient 74:ea0021abecf7 183 (STRING_concat(relativePath, "/files") == 0) &&
AzureIoTClient 74:ea0021abecf7 184 (STRING_concat(relativePath, API_VERSION) == 0)
AzureIoTClient 74:ea0021abecf7 185 ))
AzureIoTClient 74:ea0021abecf7 186 {
AzureIoTClient 74:ea0021abecf7 187 /*Codes_SRS_IOTHUBCLIENT_LL_02_067: [ If creating the relativePath fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 188 LogError("unable to concatenate STRING");
AzureIoTClient 74:ea0021abecf7 189 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 190 }
AzureIoTClient 74:ea0021abecf7 191 else
AzureIoTClient 74:ea0021abecf7 192 {
AzureIoTClient 74:ea0021abecf7 193 /*Codes_SRS_IOTHUBCLIENT_LL_32_001: [ IoTHubClient_LL_UploadToBlob shall create a JSON string formed from "{ \"blobName\": \" + destinationFileName + "\" }" */
AzureIoTClient 74:ea0021abecf7 194 STRING_HANDLE blobName = STRING_construct("{ \"blobName\": \"");
AzureIoTClient 74:ea0021abecf7 195 if (blobName == NULL)
AzureIoTClient 74:ea0021abecf7 196 {
AzureIoTClient 74:ea0021abecf7 197 /*Codes_SRS_IOTHUBCLIENT_LL_32_002: [ If creating the JSON string fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 198 LogError("unable to STRING_construct");
AzureIoTClient 74:ea0021abecf7 199 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 200 }
AzureIoTClient 74:ea0021abecf7 201 else
AzureIoTClient 74:ea0021abecf7 202 {
AzureIoTClient 74:ea0021abecf7 203 if (!(
AzureIoTClient 74:ea0021abecf7 204 (STRING_concat(blobName, destinationFileName) == 0) &&
AzureIoTClient 74:ea0021abecf7 205 (STRING_concat(blobName, "\" }") == 0)
AzureIoTClient 74:ea0021abecf7 206 ))
AzureIoTClient 74:ea0021abecf7 207 {
AzureIoTClient 74:ea0021abecf7 208 /*Codes_SRS_IOTHUBCLIENT_LL_32_002: [ If creating the JSON string fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 209 LogError("unable to concatenate STRING");
AzureIoTClient 74:ea0021abecf7 210 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 211 }
AzureIoTClient 74:ea0021abecf7 212 else
AzureIoTClient 74:ea0021abecf7 213 {
AzureIoTClient 69:b6f532f8c608 214 size_t len = STRING_length(blobName);
AzureIoTClient 74:ea0021abecf7 215 BUFFER_HANDLE blobBuffer = BUFFER_create((const unsigned char *)STRING_c_str(blobName), len);
AzureIoTClient 42:448eecc3676e 216
AzureIoTClient 74:ea0021abecf7 217 if (blobBuffer == NULL)
AzureIoTClient 74:ea0021abecf7 218 {
AzureIoTClient 74:ea0021abecf7 219 /*Codes_SRS_IOTHUBCLIENT_LL_32_002: [ If creating the JSON string fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 69:b6f532f8c608 220 LogError("unable to create BUFFER");
AzureIoTClient 74:ea0021abecf7 221 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 222 }
AzureIoTClient 74:ea0021abecf7 223 else
AzureIoTClient 74:ea0021abecf7 224 {
AzureIoTClient 74:ea0021abecf7 225 /*Codes_SRS_IOTHUBCLIENT_LL_02_068: [ IoTHubClient_LL_UploadToBlob shall create an HTTP responseContent BUFFER_HANDLE. ]*/
AzureIoTClient 74:ea0021abecf7 226 BUFFER_HANDLE responseContent = BUFFER_new();
AzureIoTClient 74:ea0021abecf7 227 if (responseContent == NULL)
AzureIoTClient 74:ea0021abecf7 228 {
AzureIoTClient 74:ea0021abecf7 229 /*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 74:ea0021abecf7 230 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 231 LogError("unable to BUFFER_new");
AzureIoTClient 74:ea0021abecf7 232 }
AzureIoTClient 74:ea0021abecf7 233 else
AzureIoTClient 74:ea0021abecf7 234 {
AzureIoTClient 74:ea0021abecf7 235 /*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 74:ea0021abecf7 236 /*Codes_SRS_IOTHUBCLIENT_LL_02_107: [ - "Authorization" header shall not be build. ]*/
AzureIoTClient 74:ea0021abecf7 237 if (!(
AzureIoTClient 74:ea0021abecf7 238 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Content-Type", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 74:ea0021abecf7 239 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Accept", "application/json") == HTTP_HEADERS_OK) &&
AzureIoTClient 74:ea0021abecf7 240 (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "User-Agent", "iothubclient/" IOTHUB_SDK_VERSION) == HTTP_HEADERS_OK) &&
AzureIoTClient 74:ea0021abecf7 241 (handleData->authorizationScheme == X509 || (HTTPHeaders_AddHeaderNameValuePair(requestHttpHeaders, "Authorization", "") == HTTP_HEADERS_OK))
AzureIoTClient 74:ea0021abecf7 242 ))
AzureIoTClient 74:ea0021abecf7 243 {
AzureIoTClient 74:ea0021abecf7 244 /*Codes_SRS_IOTHUBCLIENT_LL_02_071: [ If creating the HTTP headers fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 245 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 74:ea0021abecf7 246 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 247 }
AzureIoTClient 74:ea0021abecf7 248 else
AzureIoTClient 74:ea0021abecf7 249 {
AzureIoTClient 74:ea0021abecf7 250 int wasIoTHubRequestSuccess = 0; /*!=0 means responseContent has a buffer that should be parsed by parson after executing the below switch*/
AzureIoTClient 74:ea0021abecf7 251 /* set the result to error by default */
AzureIoTClient 74:ea0021abecf7 252 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 253 switch (handleData->authorizationScheme)
AzureIoTClient 74:ea0021abecf7 254 {
AzureIoTClient 74:ea0021abecf7 255 default:
AzureIoTClient 74:ea0021abecf7 256 {
AzureIoTClient 74:ea0021abecf7 257 /*wasIoTHubRequestSuccess takes care of the return value*/
AzureIoTClient 74:ea0021abecf7 258 LogError("Internal Error: unexpected value in handleData->authorizationScheme = %d", handleData->authorizationScheme);
AzureIoTClient 74:ea0021abecf7 259 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 260 break;
AzureIoTClient 74:ea0021abecf7 261 }
AzureIoTClient 74:ea0021abecf7 262 case(X509):
AzureIoTClient 74:ea0021abecf7 263 {
AzureIoTClient 74:ea0021abecf7 264 unsigned int statusCode;
AzureIoTClient 74:ea0021abecf7 265 /*Codes_SRS_IOTHUBCLIENT_LL_32_003: [ IoTHubClient_LL_UploadToBlob shall execute HTTPAPIEX_ExecuteRequest passing the following information for arguments: ]*/
AzureIoTClient 74:ea0021abecf7 266 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 74:ea0021abecf7 267 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the handle created at the beginning of `IoTHubClient_LL_UploadToBlob`*/
AzureIoTClient 74:ea0021abecf7 268 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_POST*/
AzureIoTClient 74:ea0021abecf7 269 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 74:ea0021abecf7 270 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 74:ea0021abecf7 271 blobBuffer, /*BUFFER_HANDLE requestContent - address of JSON with optional/directory/tree/filename*/
AzureIoTClient 74:ea0021abecf7 272 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 74:ea0021abecf7 273 NULL, /*HTTP_HEADERS_HANDLE responseHttpHeadersHandle - NULL*/
AzureIoTClient 74:ea0021abecf7 274 responseContent /*BUFFER_HANDLE responseContent - the HTTP response BUFFER_HANDLE - responseContent*/
AzureIoTClient 74:ea0021abecf7 275 ) != HTTPAPIEX_OK)
AzureIoTClient 74:ea0021abecf7 276 {
AzureIoTClient 74:ea0021abecf7 277 /*Codes_SRS_IOTHUBCLIENT_LL_02_076: [ If HTTPAPIEX_ExecuteRequest call fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 278 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 279 LogError("unable to HTTPAPIEX_ExecuteRequest");
AzureIoTClient 74:ea0021abecf7 280 }
AzureIoTClient 74:ea0021abecf7 281 else
AzureIoTClient 74:ea0021abecf7 282 {
AzureIoTClient 74:ea0021abecf7 283 /*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 74:ea0021abecf7 284 if (statusCode >= 300)
AzureIoTClient 74:ea0021abecf7 285 {
AzureIoTClient 74:ea0021abecf7 286 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 287 LogError("HTTP code was %u", statusCode);
AzureIoTClient 74:ea0021abecf7 288 }
AzureIoTClient 74:ea0021abecf7 289 else
AzureIoTClient 74:ea0021abecf7 290 {
AzureIoTClient 74:ea0021abecf7 291 wasIoTHubRequestSuccess = 1;
AzureIoTClient 74:ea0021abecf7 292 }
AzureIoTClient 74:ea0021abecf7 293 }
AzureIoTClient 74:ea0021abecf7 294 break;
AzureIoTClient 74:ea0021abecf7 295 }
AzureIoTClient 74:ea0021abecf7 296 case (SAS_TOKEN):
AzureIoTClient 74:ea0021abecf7 297 {
AzureIoTClient 74:ea0021abecf7 298 const char* sasToken = STRING_c_str(handleData->credentials.sas);
AzureIoTClient 74:ea0021abecf7 299 /*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 74:ea0021abecf7 300 if (HTTPHeaders_ReplaceHeaderNameValuePair(requestHttpHeaders, "Authorization", sasToken) != HTTP_HEADERS_OK)
AzureIoTClient 74:ea0021abecf7 301 {
AzureIoTClient 74:ea0021abecf7 302 /*Codes_SRS_IOTHUBCLIENT_LL_02_074: [ If adding "Authorization" fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR ]*/
AzureIoTClient 74:ea0021abecf7 303 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 304 LogError("unable to HTTPHeaders_AddHeaderNameValuePair");
AzureIoTClient 74:ea0021abecf7 305 }
AzureIoTClient 74:ea0021abecf7 306 else
AzureIoTClient 74:ea0021abecf7 307 {
AzureIoTClient 74:ea0021abecf7 308 unsigned int statusCode;
AzureIoTClient 74:ea0021abecf7 309 /*Codes_SRS_IOTHUBCLIENT_LL_32_004: [ IoTHubClient_LL_UploadToBlob shall execute HTTPAPIEX_ExecuteRequest passing the following information for arguments: ]*/
AzureIoTClient 74:ea0021abecf7 310 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 74:ea0021abecf7 311 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the handle created at the beginning of `IoTHubClient_LL_UploadToBlob`*/
AzureIoTClient 74:ea0021abecf7 312 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_POST*/
AzureIoTClient 74:ea0021abecf7 313 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 74:ea0021abecf7 314 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 74:ea0021abecf7 315 blobBuffer, /*BUFFER_HANDLE requestContent - address of JSON with optional/directory/tree/filename*/
AzureIoTClient 74:ea0021abecf7 316 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 74:ea0021abecf7 317 NULL, /*HTTP_HEADERS_HANDLE responseHttpHeadersHandle - NULL*/
AzureIoTClient 74:ea0021abecf7 318 responseContent /*BUFFER_HANDLE responseContent - the HTTP response BUFFER_HANDLE - responseContent*/
AzureIoTClient 74:ea0021abecf7 319 ) != HTTPAPIEX_OK)
AzureIoTClient 74:ea0021abecf7 320 {
AzureIoTClient 74:ea0021abecf7 321 /*Codes_SRS_IOTHUBCLIENT_LL_02_076: [ If HTTPAPIEX_ExecuteRequest call fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 322 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 323 LogError("unable to HTTPAPIEX_ExecuteRequest");
AzureIoTClient 74:ea0021abecf7 324 }
AzureIoTClient 74:ea0021abecf7 325 else
AzureIoTClient 74:ea0021abecf7 326 {
AzureIoTClient 74:ea0021abecf7 327 /*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 74:ea0021abecf7 328 if (statusCode >= 300)
AzureIoTClient 74:ea0021abecf7 329 {
AzureIoTClient 74:ea0021abecf7 330 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 331 LogError("HTTP code was %u", statusCode);
AzureIoTClient 74:ea0021abecf7 332 }
AzureIoTClient 74:ea0021abecf7 333 else
AzureIoTClient 74:ea0021abecf7 334 {
AzureIoTClient 74:ea0021abecf7 335 wasIoTHubRequestSuccess = 1;
AzureIoTClient 74:ea0021abecf7 336 }
AzureIoTClient 74:ea0021abecf7 337 }
AzureIoTClient 74:ea0021abecf7 338 }
AzureIoTClient 74:ea0021abecf7 339 break;
AzureIoTClient 74:ea0021abecf7 340 }
AzureIoTClient 74:ea0021abecf7 341 case(DEVICE_KEY):
AzureIoTClient 74:ea0021abecf7 342 {
AzureIoTClient 74:ea0021abecf7 343 /*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 74:ea0021abecf7 344 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 74:ea0021abecf7 345 if (uriResource == NULL)
AzureIoTClient 74:ea0021abecf7 346 {
AzureIoTClient 74:ea0021abecf7 347 /*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 74:ea0021abecf7 348 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 349 LogError("unable to STRING_construct");
AzureIoTClient 74:ea0021abecf7 350 }
AzureIoTClient 74:ea0021abecf7 351 else
AzureIoTClient 74:ea0021abecf7 352 {
AzureIoTClient 74:ea0021abecf7 353 if (!(
AzureIoTClient 74:ea0021abecf7 354 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 74:ea0021abecf7 355 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0)
AzureIoTClient 74:ea0021abecf7 356 ))
AzureIoTClient 74:ea0021abecf7 357 {
AzureIoTClient 74:ea0021abecf7 358 /*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 74:ea0021abecf7 359 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 74:ea0021abecf7 360 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 361 }
AzureIoTClient 74:ea0021abecf7 362 else
AzureIoTClient 74:ea0021abecf7 363 {
AzureIoTClient 74:ea0021abecf7 364 STRING_HANDLE empty = STRING_new();
AzureIoTClient 74:ea0021abecf7 365 if (empty == NULL)
AzureIoTClient 74:ea0021abecf7 366 {
AzureIoTClient 74:ea0021abecf7 367 LogError("unable to STRING_new");
AzureIoTClient 74:ea0021abecf7 368 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 369 }
AzureIoTClient 74:ea0021abecf7 370 else
AzureIoTClient 74:ea0021abecf7 371 {
AzureIoTClient 74:ea0021abecf7 372 /*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 74:ea0021abecf7 373 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 74:ea0021abecf7 374 if (sasHandle == NULL)
AzureIoTClient 74:ea0021abecf7 375 {
AzureIoTClient 74:ea0021abecf7 376 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 74:ea0021abecf7 377 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 378 }
AzureIoTClient 74:ea0021abecf7 379 else
AzureIoTClient 74:ea0021abecf7 380 {
AzureIoTClient 74:ea0021abecf7 381 unsigned int statusCode;
AzureIoTClient 74:ea0021abecf7 382 /*Codes_SRS_IOTHUBCLIENT_LL_32_005: [ IoTHubClient_LL_UploadToBlob shall call HTTPAPIEX_SAS_ExecuteRequest passing as arguments: ]*/
AzureIoTClient 74:ea0021abecf7 383 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 74:ea0021abecf7 384 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 74:ea0021abecf7 385 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 74:ea0021abecf7 386 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_POST*/
AzureIoTClient 74:ea0021abecf7 387 STRING_c_str(relativePath), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 74:ea0021abecf7 388 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 74:ea0021abecf7 389 blobBuffer, /*BUFFER_HANDLE requestContent - address of JSON with optional/directory/tree/filename*/
AzureIoTClient 74:ea0021abecf7 390 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 74:ea0021abecf7 391 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 74:ea0021abecf7 392 responseContent
AzureIoTClient 74:ea0021abecf7 393 ) != HTTPAPIEX_OK)
AzureIoTClient 74:ea0021abecf7 394 {
AzureIoTClient 74:ea0021abecf7 395 /*Codes_SRS_IOTHUBCLIENT_LL_02_079: [ If HTTPAPIEX_SAS_ExecuteRequest fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 396 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 74:ea0021abecf7 397 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 398 }
AzureIoTClient 74:ea0021abecf7 399 else
AzureIoTClient 74:ea0021abecf7 400 {
AzureIoTClient 74:ea0021abecf7 401 if (statusCode >= 300)
AzureIoTClient 74:ea0021abecf7 402 {
AzureIoTClient 74:ea0021abecf7 403 /*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 74:ea0021abecf7 404 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 405 LogError("HTTP code was %u", statusCode);
AzureIoTClient 74:ea0021abecf7 406 }
AzureIoTClient 74:ea0021abecf7 407 else
AzureIoTClient 74:ea0021abecf7 408 {
AzureIoTClient 74:ea0021abecf7 409 wasIoTHubRequestSuccess = 1;
AzureIoTClient 74:ea0021abecf7 410 }
AzureIoTClient 74:ea0021abecf7 411 }
AzureIoTClient 74:ea0021abecf7 412 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 74:ea0021abecf7 413 }
AzureIoTClient 74:ea0021abecf7 414 STRING_delete(empty);
AzureIoTClient 74:ea0021abecf7 415 }
AzureIoTClient 74:ea0021abecf7 416 }
AzureIoTClient 74:ea0021abecf7 417 STRING_delete(uriResource);
AzureIoTClient 74:ea0021abecf7 418 }
AzureIoTClient 74:ea0021abecf7 419 }
AzureIoTClient 74:ea0021abecf7 420 } /*switch*/
AzureIoTClient 42:448eecc3676e 421
AzureIoTClient 74:ea0021abecf7 422 if (wasIoTHubRequestSuccess == 0)
AzureIoTClient 74:ea0021abecf7 423 {
AzureIoTClient 74:ea0021abecf7 424 /*do nothing, shall be reported as an error*/
AzureIoTClient 74:ea0021abecf7 425 }
AzureIoTClient 74:ea0021abecf7 426 else
AzureIoTClient 74:ea0021abecf7 427 {
AzureIoTClient 74:ea0021abecf7 428 const unsigned char*responseContent_u_char = BUFFER_u_char(responseContent);
AzureIoTClient 74:ea0021abecf7 429 size_t responseContent_length = BUFFER_length(responseContent);
AzureIoTClient 74:ea0021abecf7 430 STRING_HANDLE responseAsString = STRING_from_byte_array(responseContent_u_char, responseContent_length);
AzureIoTClient 74:ea0021abecf7 431 if (responseAsString == NULL)
AzureIoTClient 74:ea0021abecf7 432 {
AzureIoTClient 74:ea0021abecf7 433 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 434 LogError("unable to get the response as string");
AzureIoTClient 74:ea0021abecf7 435 }
AzureIoTClient 74:ea0021abecf7 436 else
AzureIoTClient 74:ea0021abecf7 437 {
AzureIoTClient 74:ea0021abecf7 438 /*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 74:ea0021abecf7 439 JSON_Value* allJson = json_parse_string(STRING_c_str(responseAsString));
AzureIoTClient 74:ea0021abecf7 440 if (allJson == NULL)
AzureIoTClient 74:ea0021abecf7 441 {
AzureIoTClient 74:ea0021abecf7 442 /*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 74:ea0021abecf7 443 LogError("unable to json_parse_string");
AzureIoTClient 74:ea0021abecf7 444 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 445 }
AzureIoTClient 74:ea0021abecf7 446 else
AzureIoTClient 74:ea0021abecf7 447 {
AzureIoTClient 74:ea0021abecf7 448 JSON_Object* jsonObject = json_value_get_object(allJson);
AzureIoTClient 74:ea0021abecf7 449 if (jsonObject == NULL)
AzureIoTClient 74:ea0021abecf7 450 {
AzureIoTClient 74:ea0021abecf7 451 /*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 74:ea0021abecf7 452 LogError("unable to json_value_get_object");
AzureIoTClient 74:ea0021abecf7 453 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 454 }
AzureIoTClient 74:ea0021abecf7 455 else
AzureIoTClient 74:ea0021abecf7 456 {
AzureIoTClient 74:ea0021abecf7 457 const char* json_correlationId;
AzureIoTClient 74:ea0021abecf7 458 json_correlationId = json_object_get_string(jsonObject, "correlationId");
AzureIoTClient 74:ea0021abecf7 459 if (json_correlationId == NULL)
AzureIoTClient 74:ea0021abecf7 460 {
AzureIoTClient 74:ea0021abecf7 461 /*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 74:ea0021abecf7 462 LogError("unable to json_object_get_string(jsonObject, \"correlationId\")");
AzureIoTClient 74:ea0021abecf7 463 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 464 }
AzureIoTClient 74:ea0021abecf7 465 else
AzureIoTClient 74:ea0021abecf7 466 {
AzureIoTClient 74:ea0021abecf7 467 if (STRING_copy(correlationId, json_correlationId) != 0)
AzureIoTClient 74:ea0021abecf7 468 {
AzureIoTClient 74:ea0021abecf7 469 /*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 74:ea0021abecf7 470 LogError("unable to copy json_correlationId");
AzureIoTClient 74:ea0021abecf7 471 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 472 }
AzureIoTClient 74:ea0021abecf7 473 else
AzureIoTClient 74:ea0021abecf7 474 {
AzureIoTClient 74:ea0021abecf7 475 const char* json_hostName = json_object_get_string(jsonObject, "hostName");
AzureIoTClient 74:ea0021abecf7 476 if (json_hostName == NULL)
AzureIoTClient 74:ea0021abecf7 477 {
AzureIoTClient 74:ea0021abecf7 478 /*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 74:ea0021abecf7 479 LogError("unable to json_object_get_string(jsonObject, \"hostName\")");
AzureIoTClient 74:ea0021abecf7 480 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 481 }
AzureIoTClient 74:ea0021abecf7 482 else
AzureIoTClient 74:ea0021abecf7 483 {
AzureIoTClient 74:ea0021abecf7 484 const char* json_containerName = json_object_get_string(jsonObject, "containerName");
AzureIoTClient 74:ea0021abecf7 485 if (json_containerName == NULL)
AzureIoTClient 74:ea0021abecf7 486 {
AzureIoTClient 74:ea0021abecf7 487 /*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 74:ea0021abecf7 488 LogError("unable to json_object_get_string(jsonObject, \"containerName\")");
AzureIoTClient 74:ea0021abecf7 489 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 490 }
AzureIoTClient 74:ea0021abecf7 491 else
AzureIoTClient 74:ea0021abecf7 492 {
AzureIoTClient 74:ea0021abecf7 493 const char* json_blobName = json_object_get_string(jsonObject, "blobName");
AzureIoTClient 74:ea0021abecf7 494 if (json_blobName == NULL)
AzureIoTClient 74:ea0021abecf7 495 {
AzureIoTClient 74:ea0021abecf7 496 /*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 74:ea0021abecf7 497 LogError("unable to json_object_get_string(jsonObject, \"blobName\")");
AzureIoTClient 74:ea0021abecf7 498 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 499 }
AzureIoTClient 74:ea0021abecf7 500 else
AzureIoTClient 74:ea0021abecf7 501 {
AzureIoTClient 74:ea0021abecf7 502 const char* json_sasToken = json_object_get_string(jsonObject, "sasToken");
AzureIoTClient 74:ea0021abecf7 503 if (json_sasToken == NULL)
AzureIoTClient 74:ea0021abecf7 504 {
AzureIoTClient 74:ea0021abecf7 505 /*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 74:ea0021abecf7 506 LogError("unable to json_object_get_string(jsonObject, \"sasToken\")");
AzureIoTClient 74:ea0021abecf7 507 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 508 }
AzureIoTClient 74:ea0021abecf7 509 else
AzureIoTClient 74:ea0021abecf7 510 {
AzureIoTClient 74:ea0021abecf7 511 /*good JSON received from the service*/
AzureIoTClient 42:448eecc3676e 512
AzureIoTClient 74:ea0021abecf7 513 if (STRING_copy(sasUri, "https://") != 0)
AzureIoTClient 74:ea0021abecf7 514 {
AzureIoTClient 74:ea0021abecf7 515 /*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 74:ea0021abecf7 516 LogError("unable to STRING_copy");
AzureIoTClient 74:ea0021abecf7 517 result = __FAILURE__;
AzureIoTClient 74:ea0021abecf7 518 }
AzureIoTClient 74:ea0021abecf7 519 else
AzureIoTClient 74:ea0021abecf7 520 {
AzureIoTClient 77:e4e36df9caee 521 /*Codes_SRS_IOTHUBCLIENT_LL_32_008: [ The returned file name shall be URL encoded before passing back to the cloud. ]*/
AzureIoTClient 77:e4e36df9caee 522 STRING_HANDLE fileName = URL_EncodeString(json_blobName);
AzureIoTClient 77:e4e36df9caee 523
AzureIoTClient 77:e4e36df9caee 524 if (fileName == NULL)
AzureIoTClient 77:e4e36df9caee 525 {
AzureIoTClient 77:e4e36df9caee 526 /*Codes_SRS_IOTHUBCLIENT_LL_32_009: [ If URL_EncodeString fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 77:e4e36df9caee 527 LogError("unable to URL_EncodeString of filename");
AzureIoTClient 77:e4e36df9caee 528 result = __FAILURE__;
AzureIoTClient 77:e4e36df9caee 529 }
AzureIoTClient 77:e4e36df9caee 530
AzureIoTClient 77:e4e36df9caee 531 else
AzureIoTClient 77:e4e36df9caee 532 {
AzureIoTClient 77:e4e36df9caee 533 if (!(
AzureIoTClient 77:e4e36df9caee 534 (STRING_concat(sasUri, json_hostName) == 0) &&
AzureIoTClient 77:e4e36df9caee 535 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 77:e4e36df9caee 536 (STRING_concat(sasUri, json_containerName) == 0) &&
AzureIoTClient 77:e4e36df9caee 537 (STRING_concat(sasUri, "/") == 0) &&
AzureIoTClient 77:e4e36df9caee 538 (STRING_concat(sasUri, STRING_c_str(fileName)) == 0) &&
AzureIoTClient 77:e4e36df9caee 539 (STRING_concat(sasUri, json_sasToken) == 0)
AzureIoTClient 77:e4e36df9caee 540 ))
AzureIoTClient 77:e4e36df9caee 541 {
AzureIoTClient 77:e4e36df9caee 542 /*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 77:e4e36df9caee 543 LogError("unable to STRING_concat");
AzureIoTClient 77:e4e36df9caee 544 result = __FAILURE__;
AzureIoTClient 77:e4e36df9caee 545 }
AzureIoTClient 77:e4e36df9caee 546 else
AzureIoTClient 77:e4e36df9caee 547 {
AzureIoTClient 77:e4e36df9caee 548 result = 0; /*success in step 1*/
AzureIoTClient 77:e4e36df9caee 549 }
AzureIoTClient 77:e4e36df9caee 550
AzureIoTClient 77:e4e36df9caee 551 STRING_delete(fileName);
AzureIoTClient 77:e4e36df9caee 552 }
AzureIoTClient 74:ea0021abecf7 553 }
AzureIoTClient 74:ea0021abecf7 554 }
AzureIoTClient 74:ea0021abecf7 555 }
AzureIoTClient 74:ea0021abecf7 556 }
AzureIoTClient 74:ea0021abecf7 557 }
AzureIoTClient 74:ea0021abecf7 558 }
AzureIoTClient 74:ea0021abecf7 559 }
AzureIoTClient 74:ea0021abecf7 560 }
AzureIoTClient 74:ea0021abecf7 561 json_value_free(allJson);
AzureIoTClient 74:ea0021abecf7 562 }
AzureIoTClient 74:ea0021abecf7 563 STRING_delete(responseAsString);
AzureIoTClient 74:ea0021abecf7 564 }
AzureIoTClient 74:ea0021abecf7 565 }
AzureIoTClient 74:ea0021abecf7 566 }
AzureIoTClient 74:ea0021abecf7 567 BUFFER_delete(responseContent);
AzureIoTClient 74:ea0021abecf7 568 }
AzureIoTClient 69:b6f532f8c608 569 BUFFER_delete(blobBuffer);
AzureIoTClient 74:ea0021abecf7 570 }
AzureIoTClient 74:ea0021abecf7 571 }
AzureIoTClient 74:ea0021abecf7 572 STRING_delete(blobName);
AzureIoTClient 74:ea0021abecf7 573 }
AzureIoTClient 74:ea0021abecf7 574 }
AzureIoTClient 74:ea0021abecf7 575 STRING_delete(relativePath);
AzureIoTClient 74:ea0021abecf7 576 }
AzureIoTClient 42:448eecc3676e 577 return result;
AzureIoTClient 42:448eecc3676e 578 }
AzureIoTClient 42:448eecc3676e 579
AzureIoTClient 42:448eecc3676e 580 /*returns 0 when the IoTHub has been informed about the file upload status*/
AzureIoTClient 42:448eecc3676e 581 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 582 {
AzureIoTClient 42:448eecc3676e 583 int result;
AzureIoTClient 42:448eecc3676e 584 /*here is step 3. depending on the outcome of step 2 it needs to inform IoTHub about the file upload status*/
AzureIoTClient 42:448eecc3676e 585 /*if step 1 failed, there's nothing that step 3 needs to report.*/
AzureIoTClient 42:448eecc3676e 586 /*this POST "tries" to happen*/
AzureIoTClient 42:448eecc3676e 587
AzureIoTClient 42:448eecc3676e 588 /*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 589 STRING_HANDLE uriResource = STRING_construct(handleData->hostname);
AzureIoTClient 42:448eecc3676e 590 if (uriResource == NULL)
AzureIoTClient 42:448eecc3676e 591 {
AzureIoTClient 42:448eecc3676e 592 LogError("unable to construct URI");
AzureIoTClient 60:41648c4e7036 593 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 594 }
AzureIoTClient 42:448eecc3676e 595 else
AzureIoTClient 42:448eecc3676e 596 {
AzureIoTClient 42:448eecc3676e 597 if (!(
AzureIoTClient 42:448eecc3676e 598 (STRING_concat(uriResource, "/devices/") == 0) &&
AzureIoTClient 42:448eecc3676e 599 (STRING_concat_with_STRING(uriResource, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 600 (STRING_concat(uriResource, "/files/notifications") == 0)
AzureIoTClient 42:448eecc3676e 601 ))
AzureIoTClient 42:448eecc3676e 602 {
AzureIoTClient 42:448eecc3676e 603 LogError("unable to STRING_concat");
AzureIoTClient 60:41648c4e7036 604 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 605 }
AzureIoTClient 42:448eecc3676e 606 else
AzureIoTClient 42:448eecc3676e 607 {
AzureIoTClient 42:448eecc3676e 608 STRING_HANDLE relativePathNotification = STRING_construct("/devices/");
AzureIoTClient 42:448eecc3676e 609 if (relativePathNotification == NULL)
AzureIoTClient 42:448eecc3676e 610 {
AzureIoTClient 60:41648c4e7036 611 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 612 LogError("unable to STRING_construct");
AzureIoTClient 42:448eecc3676e 613 }
AzureIoTClient 42:448eecc3676e 614 else
AzureIoTClient 42:448eecc3676e 615 {
AzureIoTClient 42:448eecc3676e 616 if (!(
AzureIoTClient 42:448eecc3676e 617 (STRING_concat_with_STRING(relativePathNotification, handleData->deviceId) == 0) &&
AzureIoTClient 42:448eecc3676e 618 (STRING_concat(relativePathNotification, "/files/notifications/") == 0) &&
AzureIoTClient 42:448eecc3676e 619 (STRING_concat(relativePathNotification, STRING_c_str(correlationId)) == 0) &&
AzureIoTClient 42:448eecc3676e 620 (STRING_concat(relativePathNotification, API_VERSION) == 0)
AzureIoTClient 42:448eecc3676e 621 ))
AzureIoTClient 42:448eecc3676e 622 {
AzureIoTClient 42:448eecc3676e 623 LogError("unable to STRING_concat_with_STRING");
AzureIoTClient 60:41648c4e7036 624 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 625 }
AzureIoTClient 42:448eecc3676e 626 else
AzureIoTClient 42:448eecc3676e 627 {
AzureIoTClient 42:448eecc3676e 628 /*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 629 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 630 {
AzureIoTClient 42:448eecc3676e 631 default:
AzureIoTClient 42:448eecc3676e 632 {
AzureIoTClient 42:448eecc3676e 633 LogError("internal error: unknown authorization Scheme");
AzureIoTClient 60:41648c4e7036 634 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 635 break;
AzureIoTClient 42:448eecc3676e 636 }
AzureIoTClient 46:6a69294b6119 637 case (X509):
AzureIoTClient 46:6a69294b6119 638 {
AzureIoTClient 46:6a69294b6119 639 unsigned int notificationStatusCode;
AzureIoTClient 46:6a69294b6119 640 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 46:6a69294b6119 641 iotHubHttpApiExHandle,
AzureIoTClient 46:6a69294b6119 642 HTTPAPI_REQUEST_POST,
AzureIoTClient 46:6a69294b6119 643 STRING_c_str(relativePathNotification),
AzureIoTClient 46:6a69294b6119 644 requestHttpHeaders,
AzureIoTClient 46:6a69294b6119 645 messageBody,
AzureIoTClient 46:6a69294b6119 646 &notificationStatusCode,
AzureIoTClient 46:6a69294b6119 647 NULL,
AzureIoTClient 46:6a69294b6119 648 NULL) != HTTPAPIEX_OK)
AzureIoTClient 46:6a69294b6119 649 {
AzureIoTClient 46:6a69294b6119 650 LogError("unable to do HTTPAPIEX_ExecuteRequest");
AzureIoTClient 60:41648c4e7036 651 result = __FAILURE__;
AzureIoTClient 46:6a69294b6119 652 }
AzureIoTClient 46:6a69294b6119 653 else
AzureIoTClient 46:6a69294b6119 654 {
AzureIoTClient 46:6a69294b6119 655 if (notificationStatusCode >= 300)
AzureIoTClient 46:6a69294b6119 656 {
AzureIoTClient 46:6a69294b6119 657 /*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 658 LogError("server didn't like the notification request");
AzureIoTClient 60:41648c4e7036 659 result = __FAILURE__;
AzureIoTClient 46:6a69294b6119 660 }
AzureIoTClient 46:6a69294b6119 661 else
AzureIoTClient 46:6a69294b6119 662 {
AzureIoTClient 46:6a69294b6119 663 result = 0;
AzureIoTClient 46:6a69294b6119 664 }
AzureIoTClient 46:6a69294b6119 665 }
AzureIoTClient 46:6a69294b6119 666 break;
AzureIoTClient 46:6a69294b6119 667 }
AzureIoTClient 42:448eecc3676e 668 case (DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 669 {
AzureIoTClient 42:448eecc3676e 670 STRING_HANDLE empty = STRING_new();
AzureIoTClient 42:448eecc3676e 671 if (empty == NULL)
AzureIoTClient 42:448eecc3676e 672 {
AzureIoTClient 42:448eecc3676e 673 LogError("unable to STRING_new");
AzureIoTClient 60:41648c4e7036 674 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 675 }
AzureIoTClient 42:448eecc3676e 676 else
AzureIoTClient 42:448eecc3676e 677 {
AzureIoTClient 42:448eecc3676e 678 HTTPAPIEX_SAS_HANDLE sasHandle = HTTPAPIEX_SAS_Create(handleData->credentials.deviceKey, uriResource, empty);
AzureIoTClient 42:448eecc3676e 679 if (sasHandle == NULL)
AzureIoTClient 42:448eecc3676e 680 {
AzureIoTClient 42:448eecc3676e 681 LogError("unable to HTTPAPIEX_SAS_Create");
AzureIoTClient 60:41648c4e7036 682 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 683 }
AzureIoTClient 42:448eecc3676e 684 else
AzureIoTClient 42:448eecc3676e 685 {
AzureIoTClient 42:448eecc3676e 686 unsigned int statusCode;
AzureIoTClient 42:448eecc3676e 687 if (HTTPAPIEX_SAS_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 688 sasHandle, /*HTTPAPIEX_SAS_HANDLE sasHandle - the created HTTPAPIEX_SAS_HANDLE*/
AzureIoTClient 42:448eecc3676e 689 iotHubHttpApiExHandle, /*HTTPAPIEX_HANDLE handle - the created HTTPAPIEX_HANDLE*/
AzureIoTClient 42:448eecc3676e 690 HTTPAPI_REQUEST_POST, /*HTTPAPI_REQUEST_TYPE requestType - HTTPAPI_REQUEST_GET*/
AzureIoTClient 42:448eecc3676e 691 STRING_c_str(relativePathNotification), /*const char* relativePath - the HTTP relative path*/
AzureIoTClient 42:448eecc3676e 692 requestHttpHeaders, /*HTTP_HEADERS_HANDLE requestHttpHeadersHandle - request HTTP headers*/
AzureIoTClient 42:448eecc3676e 693 messageBody, /*BUFFER_HANDLE requestContent*/
AzureIoTClient 42:448eecc3676e 694 &statusCode, /*unsigned int* statusCode - the address of an unsigned int that will contain the HTTP status code*/
AzureIoTClient 42:448eecc3676e 695 NULL, /*HTTP_HEADERS_HANDLE responseHeadersHandle - NULL*/
AzureIoTClient 42:448eecc3676e 696 NULL
AzureIoTClient 42:448eecc3676e 697 ) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 698 {
AzureIoTClient 42:448eecc3676e 699 /*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 700 LogError("unable to HTTPAPIEX_SAS_ExecuteRequest");
AzureIoTClient 60:41648c4e7036 701 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 702 ;
AzureIoTClient 42:448eecc3676e 703 }
AzureIoTClient 42:448eecc3676e 704 else
AzureIoTClient 42:448eecc3676e 705 {
AzureIoTClient 42:448eecc3676e 706 if (statusCode >= 300)
AzureIoTClient 42:448eecc3676e 707 {
AzureIoTClient 42:448eecc3676e 708 /*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 60:41648c4e7036 709 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 710 LogError("HTTP code was %u", statusCode);
AzureIoTClient 42:448eecc3676e 711 }
AzureIoTClient 42:448eecc3676e 712 else
AzureIoTClient 42:448eecc3676e 713 {
AzureIoTClient 42:448eecc3676e 714 result = 0;
AzureIoTClient 42:448eecc3676e 715 }
AzureIoTClient 42:448eecc3676e 716 }
AzureIoTClient 42:448eecc3676e 717 HTTPAPIEX_SAS_Destroy(sasHandle);
AzureIoTClient 42:448eecc3676e 718 }
AzureIoTClient 42:448eecc3676e 719 STRING_delete(empty);
AzureIoTClient 42:448eecc3676e 720 }
AzureIoTClient 42:448eecc3676e 721 break;
AzureIoTClient 42:448eecc3676e 722 }
AzureIoTClient 42:448eecc3676e 723 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 724 {
AzureIoTClient 42:448eecc3676e 725 unsigned int notificationStatusCode;
AzureIoTClient 42:448eecc3676e 726 if (HTTPAPIEX_ExecuteRequest(
AzureIoTClient 42:448eecc3676e 727 iotHubHttpApiExHandle,
AzureIoTClient 42:448eecc3676e 728 HTTPAPI_REQUEST_POST,
AzureIoTClient 42:448eecc3676e 729 STRING_c_str(relativePathNotification),
AzureIoTClient 42:448eecc3676e 730 requestHttpHeaders,
AzureIoTClient 42:448eecc3676e 731 messageBody,
AzureIoTClient 42:448eecc3676e 732 &notificationStatusCode,
AzureIoTClient 42:448eecc3676e 733 NULL,
AzureIoTClient 42:448eecc3676e 734 NULL) != HTTPAPIEX_OK)
AzureIoTClient 42:448eecc3676e 735 {
AzureIoTClient 42:448eecc3676e 736 LogError("unable to do HTTPAPIEX_ExecuteRequest");
AzureIoTClient 60:41648c4e7036 737 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 738 }
AzureIoTClient 42:448eecc3676e 739 else
AzureIoTClient 42:448eecc3676e 740 {
AzureIoTClient 42:448eecc3676e 741 if (notificationStatusCode >= 300)
AzureIoTClient 42:448eecc3676e 742 {
AzureIoTClient 42:448eecc3676e 743 /*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 744 LogError("server didn't like the notification request");
AzureIoTClient 60:41648c4e7036 745 result = __FAILURE__;
AzureIoTClient 42:448eecc3676e 746 }
AzureIoTClient 42:448eecc3676e 747 else
AzureIoTClient 42:448eecc3676e 748 {
AzureIoTClient 42:448eecc3676e 749 result = 0;
AzureIoTClient 42:448eecc3676e 750 }
AzureIoTClient 42:448eecc3676e 751 }
AzureIoTClient 42:448eecc3676e 752 break;
AzureIoTClient 42:448eecc3676e 753 }
AzureIoTClient 42:448eecc3676e 754 } /*switch authorizationScheme*/
AzureIoTClient 42:448eecc3676e 755 }
AzureIoTClient 42:448eecc3676e 756 STRING_delete(relativePathNotification);
AzureIoTClient 42:448eecc3676e 757 }
AzureIoTClient 42:448eecc3676e 758 }
AzureIoTClient 42:448eecc3676e 759 STRING_delete(uriResource);
AzureIoTClient 42:448eecc3676e 760 }
AzureIoTClient 42:448eecc3676e 761 return result;
AzureIoTClient 42:448eecc3676e 762 }
AzureIoTClient 42:448eecc3676e 763
AzureIoTClient 42:448eecc3676e 764 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 765 {
AzureIoTClient 42:448eecc3676e 766 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 48:cc5d91f2b06d 767 BUFFER_HANDLE toBeTransmitted;
AzureIoTClient 48:cc5d91f2b06d 768 int requiredStringLength;
AzureIoTClient 48:cc5d91f2b06d 769 char* requiredString;
AzureIoTClient 42:448eecc3676e 770
AzureIoTClient 42:448eecc3676e 771 /*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 772 /*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 773 /*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 774 if (
AzureIoTClient 42:448eecc3676e 775 (handle == NULL) ||
AzureIoTClient 42:448eecc3676e 776 (destinationFileName == NULL) ||
Azure.IoT Build 45:54c11b1b1407 777 ((source == NULL) && (size > 0))
AzureIoTClient 42:448eecc3676e 778 )
AzureIoTClient 42:448eecc3676e 779 {
AzureIoTClient 42:448eecc3676e 780 LogError("invalid argument detected handle=%p destinationFileName=%p source=%p size=%zu", handle, destinationFileName, source, size);
AzureIoTClient 42:448eecc3676e 781 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 42:448eecc3676e 782 }
AzureIoTClient 42:448eecc3676e 783 else
AzureIoTClient 42:448eecc3676e 784 {
AzureIoTClient 42:448eecc3676e 785 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 786
AzureIoTClient 42:448eecc3676e 787 /*Codes_SRS_IOTHUBCLIENT_LL_02_064: [ IoTHubClient_LL_UploadToBlob shall create an HTTPAPIEX_HANDLE to the IoTHub hostname. ]*/
AzureIoTClient 42:448eecc3676e 788 HTTPAPIEX_HANDLE iotHubHttpApiExHandle = HTTPAPIEX_Create(handleData->hostname);
AzureIoTClient 42:448eecc3676e 789
AzureIoTClient 42:448eecc3676e 790 /*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 791 if (iotHubHttpApiExHandle == NULL)
AzureIoTClient 42:448eecc3676e 792 {
AzureIoTClient 42:448eecc3676e 793 LogError("unable to HTTPAPIEX_Create");
AzureIoTClient 42:448eecc3676e 794 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 795 }
AzureIoTClient 42:448eecc3676e 796 else
AzureIoTClient 42:448eecc3676e 797 {
AzureIoTClient 46:6a69294b6119 798 if (
AzureIoTClient 46:6a69294b6119 799 (handleData->authorizationScheme == X509) &&
AzureIoTClient 46:6a69294b6119 800
AzureIoTClient 46:6a69294b6119 801 /*transmit the x509certificate and x509privatekey*/
AzureIoTClient 46:6a69294b6119 802 /*Codes_SRS_IOTHUBCLIENT_LL_02_106: [ - x509certificate and x509privatekey saved options shall be passed on the HTTPAPIEX_SetOption ]*/
AzureIoTClient 46:6a69294b6119 803 (!(
AzureIoTClient 48:cc5d91f2b06d 804 (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, OPTION_X509_CERT, handleData->credentials.x509credentials.x509certificate) == HTTPAPIEX_OK) &&
AzureIoTClient 48:cc5d91f2b06d 805 (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, OPTION_X509_PRIVATE_KEY, handleData->credentials.x509credentials.x509privatekey) == HTTPAPIEX_OK)
AzureIoTClient 46:6a69294b6119 806 ))
AzureIoTClient 46:6a69294b6119 807 )
AzureIoTClient 42:448eecc3676e 808 {
AzureIoTClient 46:6a69294b6119 809 LogError("unable to HTTPAPIEX_SetOption for x509");
AzureIoTClient 42:448eecc3676e 810 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 811 }
AzureIoTClient 42:448eecc3676e 812 else
AzureIoTClient 42:448eecc3676e 813 {
AzureIoTClient 62:5a4cdacf5090 814 /*Codes_SRS_IOTHUBCLIENT_LL_02_111: [ If certificates is non-NULL then certificates shall be passed to HTTPAPIEX_SetOption with optionName TrustedCerts. ]*/
AzureIoTClient 62:5a4cdacf5090 815 if ((handleData->certificates != NULL) && (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, "TrustedCerts", handleData->certificates) != HTTPAPIEX_OK))
AzureIoTClient 42:448eecc3676e 816 {
AzureIoTClient 62:5a4cdacf5090 817 LogError("unable to set TrustedCerts!");
AzureIoTClient 42:448eecc3676e 818 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 819 }
AzureIoTClient 42:448eecc3676e 820 else
AzureIoTClient 42:448eecc3676e 821 {
AzureIoTClient 62:5a4cdacf5090 822
AzureIoTClient 74:ea0021abecf7 823 if (handleData->http_proxy_options.host_address != NULL)
AzureIoTClient 42:448eecc3676e 824 {
AzureIoTClient 74:ea0021abecf7 825 HTTP_PROXY_OPTIONS proxy_options;
AzureIoTClient 74:ea0021abecf7 826 proxy_options = handleData->http_proxy_options;
AzureIoTClient 74:ea0021abecf7 827
AzureIoTClient 74:ea0021abecf7 828 if (HTTPAPIEX_SetOption(iotHubHttpApiExHandle, OPTION_HTTP_PROXY, &proxy_options) != HTTPAPIEX_OK)
AzureIoTClient 74:ea0021abecf7 829 {
AzureIoTClient 74:ea0021abecf7 830 LogError("unable to set http proxy!");
AzureIoTClient 74:ea0021abecf7 831 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 832 }
AzureIoTClient 74:ea0021abecf7 833 else
AzureIoTClient 74:ea0021abecf7 834 {
AzureIoTClient 74:ea0021abecf7 835 result = IOTHUB_CLIENT_OK;
AzureIoTClient 74:ea0021abecf7 836 }
AzureIoTClient 42:448eecc3676e 837 }
AzureIoTClient 42:448eecc3676e 838 else
AzureIoTClient 42:448eecc3676e 839 {
AzureIoTClient 74:ea0021abecf7 840 result = IOTHUB_CLIENT_OK;
AzureIoTClient 74:ea0021abecf7 841 }
AzureIoTClient 74:ea0021abecf7 842
AzureIoTClient 74:ea0021abecf7 843 if (result != IOTHUB_CLIENT_ERROR)
AzureIoTClient 74:ea0021abecf7 844 {
AzureIoTClient 74:ea0021abecf7 845 STRING_HANDLE correlationId = STRING_new();
AzureIoTClient 74:ea0021abecf7 846 if (correlationId == NULL)
AzureIoTClient 42:448eecc3676e 847 {
AzureIoTClient 62:5a4cdacf5090 848 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 849 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 850 }
AzureIoTClient 42:448eecc3676e 851 else
AzureIoTClient 42:448eecc3676e 852 {
AzureIoTClient 74:ea0021abecf7 853 STRING_HANDLE sasUri = STRING_new();
AzureIoTClient 74:ea0021abecf7 854 if (sasUri == NULL)
AzureIoTClient 42:448eecc3676e 855 {
AzureIoTClient 74:ea0021abecf7 856 LogError("unable to STRING_new");
AzureIoTClient 42:448eecc3676e 857 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 858 }
AzureIoTClient 42:448eecc3676e 859 else
AzureIoTClient 42:448eecc3676e 860 {
AzureIoTClient 74:ea0021abecf7 861 /*Codes_SRS_IOTHUBCLIENT_LL_02_070: [ IoTHubClient_LL_UploadToBlob shall create request HTTP headers. ]*/
AzureIoTClient 74:ea0021abecf7 862 HTTP_HEADERS_HANDLE requestHttpHeaders = HTTPHeaders_Alloc(); /*these are build by step 1 and used by step 3 too*/
AzureIoTClient 74:ea0021abecf7 863 if (requestHttpHeaders == NULL)
AzureIoTClient 46:6a69294b6119 864 {
AzureIoTClient 74:ea0021abecf7 865 LogError("unable to HTTPHeaders_Alloc");
AzureIoTClient 42:448eecc3676e 866 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 867 }
AzureIoTClient 42:448eecc3676e 868 else
AzureIoTClient 42:448eecc3676e 869 {
AzureIoTClient 74:ea0021abecf7 870 /*do step 1*/
AzureIoTClient 74:ea0021abecf7 871 if (IoTHubClient_LL_UploadToBlob_step1and2(handleData, iotHubHttpApiExHandle, requestHttpHeaders, destinationFileName, correlationId, sasUri) != 0)
AzureIoTClient 62:5a4cdacf5090 872 {
AzureIoTClient 74:ea0021abecf7 873 LogError("error in IoTHubClient_LL_UploadToBlob_step1");
AzureIoTClient 42:448eecc3676e 874 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 875 }
AzureIoTClient 42:448eecc3676e 876 else
AzureIoTClient 42:448eecc3676e 877 {
AzureIoTClient 74:ea0021abecf7 878 /*do step 2.*/
AzureIoTClient 46:6a69294b6119 879
AzureIoTClient 74:ea0021abecf7 880 unsigned int httpResponse;
AzureIoTClient 74:ea0021abecf7 881 BUFFER_HANDLE responseToIoTHub = BUFFER_new();
AzureIoTClient 74:ea0021abecf7 882 if (responseToIoTHub == NULL)
AzureIoTClient 74:ea0021abecf7 883 {
AzureIoTClient 42:448eecc3676e 884 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 885 LogError("unable to BUFFER_new");
AzureIoTClient 42:448eecc3676e 886 }
AzureIoTClient 42:448eecc3676e 887 else
AzureIoTClient 42:448eecc3676e 888 {
AzureIoTClient 74:ea0021abecf7 889 int step2success;
AzureIoTClient 74:ea0021abecf7 890 /*Codes_SRS_IOTHUBCLIENT_LL_02_083: [ IoTHubClient_LL_UploadToBlob shall call Blob_UploadFromSasUri and capture the HTTP return code and HTTP body. ]*/
AzureIoTClient 74:ea0021abecf7 891 step2success = (Blob_UploadFromSasUri(STRING_c_str(sasUri), source, size, &httpResponse, responseToIoTHub, handleData->certificates) == BLOB_OK);
AzureIoTClient 74:ea0021abecf7 892 if (!step2success)
AzureIoTClient 74:ea0021abecf7 893 {
AzureIoTClient 74:ea0021abecf7 894 /*Codes_SRS_IOTHUBCLIENT_LL_02_084: [ If Blob_UploadFromSasUri fails then IoTHubClient_LL_UploadToBlob shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 74:ea0021abecf7 895 LogError("unable to Blob_UploadFromSasUri");
AzureIoTClient 62:5a4cdacf5090 896
AzureIoTClient 74:ea0021abecf7 897 /*do step 3*/ /*try*/
AzureIoTClient 74:ea0021abecf7 898 /*Codes_SRS_IOTHUBCLIENT_LL_02_091: [ If step 2 fails without establishing an HTTP dialogue, then the HTTP message body shall look like: ]*/
AzureIoTClient 74:ea0021abecf7 899 if (BUFFER_build(responseToIoTHub, (const unsigned char*)FILE_UPLOAD_FAILED_BODY, sizeof(FILE_UPLOAD_FAILED_BODY) / sizeof(FILE_UPLOAD_FAILED_BODY[0])) == 0)
AzureIoTClient 74:ea0021abecf7 900 {
AzureIoTClient 74:ea0021abecf7 901 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, responseToIoTHub) != 0)
AzureIoTClient 74:ea0021abecf7 902 {
AzureIoTClient 74:ea0021abecf7 903 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 74:ea0021abecf7 904 }
AzureIoTClient 74:ea0021abecf7 905 }
AzureIoTClient 42:448eecc3676e 906 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 42:448eecc3676e 907 }
AzureIoTClient 42:448eecc3676e 908 else
AzureIoTClient 42:448eecc3676e 909 {
AzureIoTClient 74:ea0021abecf7 910 /*must make a json*/
AzureIoTClient 74:ea0021abecf7 911
AzureIoTClient 74:ea0021abecf7 912 requiredStringLength = snprintf(NULL, 0, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 74:ea0021abecf7 913
AzureIoTClient 74:ea0021abecf7 914 requiredString = malloc(requiredStringLength + 1);
AzureIoTClient 74:ea0021abecf7 915 if (requiredString == 0)
AzureIoTClient 46:6a69294b6119 916 {
AzureIoTClient 74:ea0021abecf7 917 LogError("unable to malloc");
AzureIoTClient 46:6a69294b6119 918 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 919 }
AzureIoTClient 46:6a69294b6119 920 else
AzureIoTClient 46:6a69294b6119 921 {
AzureIoTClient 74:ea0021abecf7 922 /*do again snprintf*/
AzureIoTClient 74:ea0021abecf7 923 (void)snprintf(requiredString, requiredStringLength + 1, "{\"isSuccess\":%s, \"statusCode\":%d, \"statusDescription\":\"%s\"}", ((httpResponse < 300) ? "true" : "false"), httpResponse, BUFFER_u_char(responseToIoTHub));
AzureIoTClient 74:ea0021abecf7 924 toBeTransmitted = BUFFER_create((const unsigned char*)requiredString, requiredStringLength);
AzureIoTClient 74:ea0021abecf7 925 if (toBeTransmitted == NULL)
AzureIoTClient 62:5a4cdacf5090 926 {
AzureIoTClient 74:ea0021abecf7 927 LogError("unable to BUFFER_create");
AzureIoTClient 62:5a4cdacf5090 928 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 62:5a4cdacf5090 929 }
AzureIoTClient 62:5a4cdacf5090 930 else
AzureIoTClient 62:5a4cdacf5090 931 {
AzureIoTClient 74:ea0021abecf7 932 if (IoTHubClient_LL_UploadToBlob_step3(handleData, correlationId, iotHubHttpApiExHandle, requestHttpHeaders, toBeTransmitted) != 0)
AzureIoTClient 74:ea0021abecf7 933 {
AzureIoTClient 74:ea0021abecf7 934 LogError("IoTHubClient_LL_UploadToBlob_step3 failed");
AzureIoTClient 74:ea0021abecf7 935 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 936 }
AzureIoTClient 74:ea0021abecf7 937 else
AzureIoTClient 74:ea0021abecf7 938 {
AzureIoTClient 74:ea0021abecf7 939 result = (httpResponse < 300) ? IOTHUB_CLIENT_OK : IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 940 }
AzureIoTClient 74:ea0021abecf7 941 BUFFER_delete(toBeTransmitted);
AzureIoTClient 62:5a4cdacf5090 942 }
AzureIoTClient 74:ea0021abecf7 943 free(requiredString);
AzureIoTClient 46:6a69294b6119 944 }
AzureIoTClient 42:448eecc3676e 945 }
AzureIoTClient 74:ea0021abecf7 946 BUFFER_delete(responseToIoTHub);
AzureIoTClient 42:448eecc3676e 947 }
AzureIoTClient 42:448eecc3676e 948 }
AzureIoTClient 74:ea0021abecf7 949 HTTPHeaders_Free(requestHttpHeaders);
AzureIoTClient 42:448eecc3676e 950 }
AzureIoTClient 74:ea0021abecf7 951 STRING_delete(sasUri);
AzureIoTClient 42:448eecc3676e 952 }
AzureIoTClient 74:ea0021abecf7 953 STRING_delete(correlationId);
AzureIoTClient 42:448eecc3676e 954 }
AzureIoTClient 42:448eecc3676e 955 }
AzureIoTClient 42:448eecc3676e 956 }
AzureIoTClient 42:448eecc3676e 957 }
AzureIoTClient 42:448eecc3676e 958 HTTPAPIEX_Destroy(iotHubHttpApiExHandle);
AzureIoTClient 42:448eecc3676e 959 }
AzureIoTClient 42:448eecc3676e 960 }
AzureIoTClient 42:448eecc3676e 961 return result;
AzureIoTClient 42:448eecc3676e 962 }
AzureIoTClient 42:448eecc3676e 963
AzureIoTClient 42:448eecc3676e 964 void IoTHubClient_LL_UploadToBlob_Destroy(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle)
AzureIoTClient 42:448eecc3676e 965 {
AzureIoTClient 42:448eecc3676e 966 if (handle == NULL)
AzureIoTClient 42:448eecc3676e 967 {
AzureIoTClient 62:5a4cdacf5090 968 LogError("unexpected NULL argument");
AzureIoTClient 42:448eecc3676e 969 }
AzureIoTClient 42:448eecc3676e 970 else
AzureIoTClient 42:448eecc3676e 971 {
AzureIoTClient 42:448eecc3676e 972 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 42:448eecc3676e 973 switch (handleData->authorizationScheme)
AzureIoTClient 42:448eecc3676e 974 {
AzureIoTClient 42:448eecc3676e 975 case(SAS_TOKEN):
AzureIoTClient 42:448eecc3676e 976 {
AzureIoTClient 42:448eecc3676e 977 STRING_delete(handleData->credentials.sas);
AzureIoTClient 42:448eecc3676e 978 break;
AzureIoTClient 42:448eecc3676e 979 }
AzureIoTClient 42:448eecc3676e 980 case(DEVICE_KEY):
AzureIoTClient 42:448eecc3676e 981 {
AzureIoTClient 42:448eecc3676e 982 STRING_delete(handleData->credentials.deviceKey);
AzureIoTClient 42:448eecc3676e 983 break;
AzureIoTClient 42:448eecc3676e 984 }
AzureIoTClient 46:6a69294b6119 985 case(X509):
AzureIoTClient 46:6a69294b6119 986 {
AzureIoTClient 46:6a69294b6119 987 if (handleData->credentials.x509credentials.x509certificate != NULL)
AzureIoTClient 46:6a69294b6119 988 {
AzureIoTClient 46:6a69294b6119 989 free((void*)handleData->credentials.x509credentials.x509certificate);
AzureIoTClient 46:6a69294b6119 990 }
AzureIoTClient 46:6a69294b6119 991 if (handleData->credentials.x509credentials.x509privatekey != NULL)
AzureIoTClient 46:6a69294b6119 992 {
AzureIoTClient 46:6a69294b6119 993 free((void*)handleData->credentials.x509credentials.x509privatekey);
AzureIoTClient 46:6a69294b6119 994 }
AzureIoTClient 46:6a69294b6119 995 break;
AzureIoTClient 46:6a69294b6119 996 }
AzureIoTClient 42:448eecc3676e 997 default:
AzureIoTClient 42:448eecc3676e 998 {
AzureIoTClient 42:448eecc3676e 999 LogError("INTERNAL ERROR");
AzureIoTClient 42:448eecc3676e 1000 break;
AzureIoTClient 42:448eecc3676e 1001 }
AzureIoTClient 42:448eecc3676e 1002 }
AzureIoTClient 42:448eecc3676e 1003 free((void*)handleData->hostname);
AzureIoTClient 42:448eecc3676e 1004 STRING_delete(handleData->deviceId);
AzureIoTClient 62:5a4cdacf5090 1005 if (handleData->certificates != NULL)
AzureIoTClient 62:5a4cdacf5090 1006 {
AzureIoTClient 62:5a4cdacf5090 1007 free(handleData->certificates);
AzureIoTClient 62:5a4cdacf5090 1008 }
AzureIoTClient 74:ea0021abecf7 1009 if (handleData->http_proxy_options.host_address != NULL)
AzureIoTClient 74:ea0021abecf7 1010 {
AzureIoTClient 74:ea0021abecf7 1011 free((char *)handleData->http_proxy_options.host_address);
AzureIoTClient 74:ea0021abecf7 1012 }
AzureIoTClient 74:ea0021abecf7 1013 if (handleData->http_proxy_options.username != NULL)
AzureIoTClient 74:ea0021abecf7 1014 {
AzureIoTClient 74:ea0021abecf7 1015 free((char *)handleData->http_proxy_options.username);
AzureIoTClient 74:ea0021abecf7 1016 }
AzureIoTClient 74:ea0021abecf7 1017 if (handleData->http_proxy_options.password != NULL)
AzureIoTClient 74:ea0021abecf7 1018 {
AzureIoTClient 74:ea0021abecf7 1019 free((char *)handleData->http_proxy_options.password);
AzureIoTClient 74:ea0021abecf7 1020 }
AzureIoTClient 42:448eecc3676e 1021 free(handleData);
AzureIoTClient 42:448eecc3676e 1022 }
AzureIoTClient 42:448eecc3676e 1023 }
AzureIoTClient 46:6a69294b6119 1024
AzureIoTClient 46:6a69294b6119 1025 IOTHUB_CLIENT_RESULT IoTHubClient_LL_UploadToBlob_SetOption(IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE handle, const char* optionName, const void* value)
AzureIoTClient 46:6a69294b6119 1026 {
AzureIoTClient 46:6a69294b6119 1027 IOTHUB_CLIENT_RESULT result;
AzureIoTClient 46:6a69294b6119 1028 /*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 1029 if (handle == NULL)
AzureIoTClient 46:6a69294b6119 1030 {
AzureIoTClient 46:6a69294b6119 1031 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 1032 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 1033 }
AzureIoTClient 46:6a69294b6119 1034 else
AzureIoTClient 46:6a69294b6119 1035 {
AzureIoTClient 46:6a69294b6119 1036 IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA* handleData = (IOTHUB_CLIENT_LL_UPLOADTOBLOB_HANDLE_DATA*)handle;
AzureIoTClient 46:6a69294b6119 1037
AzureIoTClient 46:6a69294b6119 1038 /*Codes_SRS_IOTHUBCLIENT_LL_02_100: [ x509certificate - then value then is a null terminated string that contains the x509 certificate. ]*/
AzureIoTClient 48:cc5d91f2b06d 1039 if (strcmp(optionName, OPTION_X509_CERT) == 0)
AzureIoTClient 46:6a69294b6119 1040 {
AzureIoTClient 46:6a69294b6119 1041 /*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 1042 if (handleData->authorizationScheme != X509)
AzureIoTClient 46:6a69294b6119 1043 {
AzureIoTClient 46:6a69294b6119 1044 LogError("trying to set a x509 certificate while the authentication scheme is not x509");
AzureIoTClient 46:6a69294b6119 1045 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 1046 }
AzureIoTClient 46:6a69294b6119 1047 else
AzureIoTClient 46:6a69294b6119 1048 {
AzureIoTClient 46:6a69294b6119 1049 /*Codes_SRS_IOTHUBCLIENT_LL_02_103: [ The options shall be saved. ]*/
AzureIoTClient 46:6a69294b6119 1050 /*try to make a copy of the certificate*/
AzureIoTClient 46:6a69294b6119 1051 char* temp;
AzureIoTClient 46:6a69294b6119 1052 if (mallocAndStrcpy_s(&temp, value) != 0)
AzureIoTClient 46:6a69294b6119 1053 {
AzureIoTClient 46:6a69294b6119 1054 /*Codes_SRS_IOTHUBCLIENT_LL_02_104: [ If saving fails, then IoTHubClient_LL_UploadToBlob_SetOption shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 1055 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 46:6a69294b6119 1056 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 1057 }
AzureIoTClient 46:6a69294b6119 1058 else
AzureIoTClient 46:6a69294b6119 1059 {
AzureIoTClient 46:6a69294b6119 1060 /*Codes_SRS_IOTHUBCLIENT_LL_02_105: [ Otherwise IoTHubClient_LL_UploadToBlob_SetOption shall succeed and return IOTHUB_CLIENT_OK. ]*/
AzureIoTClient 46:6a69294b6119 1061 if (handleData->credentials.x509credentials.x509certificate != NULL) /*free any previous values, if any*/
AzureIoTClient 46:6a69294b6119 1062 {
AzureIoTClient 46:6a69294b6119 1063 free((void*)handleData->credentials.x509credentials.x509certificate);
AzureIoTClient 46:6a69294b6119 1064 }
AzureIoTClient 46:6a69294b6119 1065 handleData->credentials.x509credentials.x509certificate = temp;
AzureIoTClient 46:6a69294b6119 1066 result = IOTHUB_CLIENT_OK;
AzureIoTClient 46:6a69294b6119 1067 }
AzureIoTClient 46:6a69294b6119 1068 }
AzureIoTClient 46:6a69294b6119 1069 }
AzureIoTClient 46:6a69294b6119 1070 /*Codes_SRS_IOTHUBCLIENT_LL_02_101: [ x509privatekey - then value is a null terminated string that contains the x509 privatekey. ]*/
AzureIoTClient 48:cc5d91f2b06d 1071 else if (strcmp(optionName, OPTION_X509_PRIVATE_KEY) == 0)
AzureIoTClient 46:6a69294b6119 1072 {
AzureIoTClient 46:6a69294b6119 1073 /*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 1074 if (handleData->authorizationScheme != X509)
AzureIoTClient 46:6a69294b6119 1075 {
AzureIoTClient 46:6a69294b6119 1076 LogError("trying to set a x509 privatekey while the authentication scheme is not x509");
AzureIoTClient 46:6a69294b6119 1077 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 1078 }
AzureIoTClient 46:6a69294b6119 1079 else
AzureIoTClient 46:6a69294b6119 1080 {
AzureIoTClient 46:6a69294b6119 1081 /*Codes_SRS_IOTHUBCLIENT_LL_02_103: [ The options shall be saved. ]*/
AzureIoTClient 46:6a69294b6119 1082 /*try to make a copy of the privatekey*/
AzureIoTClient 46:6a69294b6119 1083 char* temp;
AzureIoTClient 46:6a69294b6119 1084 if (mallocAndStrcpy_s(&temp, value) != 0)
AzureIoTClient 46:6a69294b6119 1085 {
AzureIoTClient 46:6a69294b6119 1086 /*Codes_SRS_IOTHUBCLIENT_LL_02_104: [ If saving fails, then IoTHubClient_LL_UploadToBlob_SetOption shall fail and return IOTHUB_CLIENT_ERROR. ]*/
AzureIoTClient 46:6a69294b6119 1087 LogError("unable to mallocAndStrcpy_s");
AzureIoTClient 46:6a69294b6119 1088 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 46:6a69294b6119 1089 }
AzureIoTClient 46:6a69294b6119 1090 else
AzureIoTClient 46:6a69294b6119 1091 {
AzureIoTClient 46:6a69294b6119 1092 /*Codes_SRS_IOTHUBCLIENT_LL_02_105: [ Otherwise IoTHubClient_LL_UploadToBlob_SetOption shall succeed and return IOTHUB_CLIENT_OK. ]*/
AzureIoTClient 46:6a69294b6119 1093 if (handleData->credentials.x509credentials.x509privatekey != NULL) /*free any previous values, if any*/
AzureIoTClient 46:6a69294b6119 1094 {
AzureIoTClient 46:6a69294b6119 1095 free((void*)handleData->credentials.x509credentials.x509privatekey);
AzureIoTClient 46:6a69294b6119 1096 }
AzureIoTClient 46:6a69294b6119 1097 handleData->credentials.x509credentials.x509privatekey = temp;
AzureIoTClient 46:6a69294b6119 1098 result = IOTHUB_CLIENT_OK;
AzureIoTClient 46:6a69294b6119 1099 }
AzureIoTClient 46:6a69294b6119 1100 }
AzureIoTClient 46:6a69294b6119 1101 }
AzureIoTClient 62:5a4cdacf5090 1102 else if (strcmp("TrustedCerts", optionName) == 0)
AzureIoTClient 62:5a4cdacf5090 1103 {
AzureIoTClient 62:5a4cdacf5090 1104 if (value == NULL)
AzureIoTClient 62:5a4cdacf5090 1105 {
AzureIoTClient 62:5a4cdacf5090 1106 LogError("NULL is a not a valid value for TrustedCerts");
AzureIoTClient 62:5a4cdacf5090 1107 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 62:5a4cdacf5090 1108 }
AzureIoTClient 62:5a4cdacf5090 1109 else
AzureIoTClient 62:5a4cdacf5090 1110 {
AzureIoTClient 62:5a4cdacf5090 1111 char* tempCopy;
AzureIoTClient 62:5a4cdacf5090 1112 if (mallocAndStrcpy_s(&tempCopy, value) != 0)
AzureIoTClient 62:5a4cdacf5090 1113 {
AzureIoTClient 62:5a4cdacf5090 1114 LogError("failure in mallocAndStrcpy_s");
AzureIoTClient 62:5a4cdacf5090 1115 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 62:5a4cdacf5090 1116 }
AzureIoTClient 62:5a4cdacf5090 1117 else
AzureIoTClient 62:5a4cdacf5090 1118 {
AzureIoTClient 62:5a4cdacf5090 1119 if (handleData->certificates != NULL)
AzureIoTClient 62:5a4cdacf5090 1120 {
AzureIoTClient 62:5a4cdacf5090 1121 free(handleData->certificates);
AzureIoTClient 62:5a4cdacf5090 1122 }
AzureIoTClient 62:5a4cdacf5090 1123 handleData->certificates = tempCopy;
AzureIoTClient 62:5a4cdacf5090 1124 result = IOTHUB_CLIENT_OK;
AzureIoTClient 62:5a4cdacf5090 1125 }
AzureIoTClient 62:5a4cdacf5090 1126 }
AzureIoTClient 62:5a4cdacf5090 1127 }
AzureIoTClient 74:ea0021abecf7 1128 /*Codes_SRS_IOTHUBCLIENT_LL_32_008: [ OPTION_HTTP_PROXY - then the value will be a pointer to HTTP_PROXY_OPTIONS structure. ]*/
AzureIoTClient 74:ea0021abecf7 1129 else if (strcmp(optionName, OPTION_HTTP_PROXY) == 0)
AzureIoTClient 74:ea0021abecf7 1130 {
AzureIoTClient 74:ea0021abecf7 1131 HTTP_PROXY_OPTIONS* proxy_options = (HTTP_PROXY_OPTIONS *)value;
AzureIoTClient 74:ea0021abecf7 1132
AzureIoTClient 74:ea0021abecf7 1133 if (proxy_options->host_address == NULL)
AzureIoTClient 74:ea0021abecf7 1134 {
AzureIoTClient 74:ea0021abecf7 1135 /* Codes_SRS_IOTHUBCLIENT_LL_32_006: [ If `host_address` is NULL, `IoTHubClient_LL_UploadToBlob_SetOption` shall fail and return `IOTHUB_CLIENT_INVALID_ARG`. ]*/
AzureIoTClient 74:ea0021abecf7 1136 LogError("NULL host_address in proxy options");
AzureIoTClient 74:ea0021abecf7 1137 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 74:ea0021abecf7 1138 }
AzureIoTClient 74:ea0021abecf7 1139 /* Codes_SRS_IOTHUBCLIENT_LL_32_007: [ If only one of `username` and `password` is NULL, `IoTHubClient_LL_UploadToBlob_SetOption` shall fail and return `IOTHUB_CLIENT_INVALID_ARG`. ]*/
AzureIoTClient 74:ea0021abecf7 1140 else if (((proxy_options->username == NULL) || (proxy_options->password == NULL)) &&
AzureIoTClient 74:ea0021abecf7 1141 (proxy_options->username != proxy_options->password))
AzureIoTClient 74:ea0021abecf7 1142 {
AzureIoTClient 74:ea0021abecf7 1143 LogError("Only one of username and password for proxy settings was NULL");
AzureIoTClient 74:ea0021abecf7 1144 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 74:ea0021abecf7 1145 }
AzureIoTClient 74:ea0021abecf7 1146 else
AzureIoTClient 74:ea0021abecf7 1147 {
AzureIoTClient 74:ea0021abecf7 1148 if (handleData->http_proxy_options.host_address != NULL)
AzureIoTClient 74:ea0021abecf7 1149 {
AzureIoTClient 74:ea0021abecf7 1150 free((char *)handleData->http_proxy_options.host_address);
AzureIoTClient 74:ea0021abecf7 1151 handleData->http_proxy_options.host_address = NULL;
AzureIoTClient 74:ea0021abecf7 1152 }
AzureIoTClient 74:ea0021abecf7 1153 if (handleData->http_proxy_options.username != NULL)
AzureIoTClient 74:ea0021abecf7 1154 {
AzureIoTClient 74:ea0021abecf7 1155 free((char *)handleData->http_proxy_options.username);
AzureIoTClient 74:ea0021abecf7 1156 handleData->http_proxy_options.username = NULL;
AzureIoTClient 74:ea0021abecf7 1157 }
AzureIoTClient 74:ea0021abecf7 1158 if (handleData->http_proxy_options.password != NULL)
AzureIoTClient 74:ea0021abecf7 1159 {
AzureIoTClient 74:ea0021abecf7 1160 free((char *)handleData->http_proxy_options.password);
AzureIoTClient 74:ea0021abecf7 1161 handleData->http_proxy_options.password = NULL;
AzureIoTClient 74:ea0021abecf7 1162 }
AzureIoTClient 74:ea0021abecf7 1163
AzureIoTClient 74:ea0021abecf7 1164 handleData->http_proxy_options.port = proxy_options->port;
AzureIoTClient 74:ea0021abecf7 1165
AzureIoTClient 74:ea0021abecf7 1166 if (mallocAndStrcpy_s((char **)(&handleData->http_proxy_options.host_address), proxy_options->host_address) != 0)
AzureIoTClient 74:ea0021abecf7 1167 {
AzureIoTClient 74:ea0021abecf7 1168 LogError("failure in mallocAndStrcpy_s - handleData->http_proxy_options.host_address");
AzureIoTClient 74:ea0021abecf7 1169 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 1170 }
AzureIoTClient 74:ea0021abecf7 1171 else if (proxy_options->username != NULL && mallocAndStrcpy_s((char **)(&handleData->http_proxy_options.username), proxy_options->username) != 0)
AzureIoTClient 74:ea0021abecf7 1172 {
AzureIoTClient 74:ea0021abecf7 1173 LogError("failure in mallocAndStrcpy_s - handleData->http_proxy_options.username");
AzureIoTClient 74:ea0021abecf7 1174 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 1175 }
AzureIoTClient 74:ea0021abecf7 1176 else if (proxy_options->password != NULL && mallocAndStrcpy_s((char **)(&handleData->http_proxy_options.password), proxy_options->password) != 0)
AzureIoTClient 74:ea0021abecf7 1177 {
AzureIoTClient 74:ea0021abecf7 1178 LogError("failure in mallocAndStrcpy_s - handleData->http_proxy_options.password");
AzureIoTClient 74:ea0021abecf7 1179 result = IOTHUB_CLIENT_ERROR;
AzureIoTClient 74:ea0021abecf7 1180 }
AzureIoTClient 74:ea0021abecf7 1181 else
AzureIoTClient 74:ea0021abecf7 1182 {
AzureIoTClient 74:ea0021abecf7 1183 result = IOTHUB_CLIENT_OK;
AzureIoTClient 74:ea0021abecf7 1184 }
AzureIoTClient 74:ea0021abecf7 1185 }
AzureIoTClient 74:ea0021abecf7 1186 }
AzureIoTClient 46:6a69294b6119 1187 else
AzureIoTClient 46:6a69294b6119 1188 {
AzureIoTClient 46:6a69294b6119 1189 /*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 1190 result = IOTHUB_CLIENT_INVALID_ARG;
AzureIoTClient 46:6a69294b6119 1191 }
AzureIoTClient 46:6a69294b6119 1192 }
AzureIoTClient 46:6a69294b6119 1193 return result;
AzureIoTClient 46:6a69294b6119 1194 }
AzureIoTClient 46:6a69294b6119 1195
AzureIoTClient 46:6a69294b6119 1196
Azure.IoT Build 45:54c11b1b1407 1197 #endif /*DONT_USE_UPLOADTOBLOB*/
AzureIoTClient 46:6a69294b6119 1198
AzureIoTClient 46:6a69294b6119 1199