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