Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip
iothub_client/iothub_client_ll_uploadtoblob.c@3:c0556ff7b8e3, 2016-12-08 (annotated)
- 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?
| User | Revision | Line number | New 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 | ¬ificationStatusCode, |
| 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 | ¬ificationStatusCode, |
| 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 |