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 Jun 16 16:16:27 2017 -0700
Revision:
69:b6f532f8c608
Parent:
62:5a4cdacf5090
Child:
74:ea0021abecf7
1.1.17

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