Mark Radbourne / Mbed 2 deprecated FXOS8700CQ_To_Azure_IoT

Dependencies:   azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip

Committer:
markrad
Date:
Thu Dec 08 00:11:40 2016 +0000
Revision:
3:c0556ff7b8e3
Hack the code to get restart working

Who changed what in which revision?

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