Azure IoT common library

Dependents:   STM32F746_iothub_client_sample_mqtt f767zi_mqtt iothub_client_sample_amqp iothub_client_sample_http ... more

Committer:
AzureIoTClient
Date:
Fri Sep 09 13:38:26 2016 -0700
Revision:
11:77df6d7e65ae
Parent:
6:c55b013dfc2a
Child:
19:2e0811512ceb
1.0.10

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Azure.IoT Build 0:fa2de1b79154 1 // Copyright (c) Microsoft. All rights reserved.
Azure.IoT Build 0:fa2de1b79154 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
Azure.IoT Build 0:fa2de1b79154 3
Azure.IoT Build 0:fa2de1b79154 4 //
Azure.IoT Build 0:fa2de1b79154 5 // PUT NO INCLUDES BEFORE HERE !!!!
Azure.IoT Build 0:fa2de1b79154 6 //
Azure.IoT Build 0:fa2de1b79154 7 #include <stdlib.h>
Azure.IoT Build 0:fa2de1b79154 8 #ifdef _CRTDBG_MAP_ALLOC
Azure.IoT Build 0:fa2de1b79154 9 #include <crtdbg.h>
Azure.IoT Build 0:fa2de1b79154 10 #endif
Azure.IoT Build 0:fa2de1b79154 11 #include "azure_c_shared_utility/gballoc.h"
Azure.IoT Build 0:fa2de1b79154 12
Azure.IoT Build 0:fa2de1b79154 13 #include <stddef.h>
Azure.IoT Build 0:fa2de1b79154 14 #include <string.h>
Azure.IoT Build 0:fa2de1b79154 15 //
Azure.IoT Build 0:fa2de1b79154 16 // PUT NO CLIENT LIBRARY INCLUDES BEFORE HERE !!!!
Azure.IoT Build 0:fa2de1b79154 17 //
Azure.IoT Build 0:fa2de1b79154 18 #include "azure_c_shared_utility/urlencode.h"
Azure.IoT Build 6:c55b013dfc2a 19 #include "azure_c_shared_utility/xlogging.h"
Azure.IoT Build 0:fa2de1b79154 20 #include "azure_c_shared_utility/strings.h"
Azure.IoT Build 0:fa2de1b79154 21
AzureIoTClient 11:77df6d7e65ae 22 #define NIBBLE_STR(c) (char)(c < 10 ? c + '0' : c - 10 + 'a')
AzureIoTClient 11:77df6d7e65ae 23 #define IS_PRINTABLE(c) ( \
AzureIoTClient 11:77df6d7e65ae 24 (c == 0) || \
AzureIoTClient 11:77df6d7e65ae 25 (c == '!') || \
AzureIoTClient 11:77df6d7e65ae 26 (c == '(') || (c == ')') || (c == '*') || \
AzureIoTClient 11:77df6d7e65ae 27 (c == '-') || (c == '.') || \
AzureIoTClient 11:77df6d7e65ae 28 ((c >= '0') && (c <= '9')) || \
AzureIoTClient 11:77df6d7e65ae 29 ((c >= 'A') && (c <= 'Z')) || \
AzureIoTClient 11:77df6d7e65ae 30 (c == '_') || \
AzureIoTClient 11:77df6d7e65ae 31 ((c >= 'a') && (c <= 'z')) \
AzureIoTClient 11:77df6d7e65ae 32 )
AzureIoTClient 11:77df6d7e65ae 33
AzureIoTClient 11:77df6d7e65ae 34 static size_t URL_PrintableChar(unsigned char charVal, char* buffer)
AzureIoTClient 11:77df6d7e65ae 35 {
AzureIoTClient 11:77df6d7e65ae 36 size_t size;
AzureIoTClient 11:77df6d7e65ae 37 if (IS_PRINTABLE(charVal))
AzureIoTClient 11:77df6d7e65ae 38 {
AzureIoTClient 11:77df6d7e65ae 39 buffer[0] = (char)charVal;
AzureIoTClient 11:77df6d7e65ae 40 size = 1;
AzureIoTClient 11:77df6d7e65ae 41 }
AzureIoTClient 11:77df6d7e65ae 42 else
AzureIoTClient 11:77df6d7e65ae 43 {
AzureIoTClient 11:77df6d7e65ae 44 char bigNibbleStr;
AzureIoTClient 11:77df6d7e65ae 45 char littleNibbleStr;
AzureIoTClient 11:77df6d7e65ae 46 unsigned char bigNibbleVal = charVal >> 4;
AzureIoTClient 11:77df6d7e65ae 47 unsigned char littleNibbleVal = charVal & 0x0F;
AzureIoTClient 11:77df6d7e65ae 48
AzureIoTClient 11:77df6d7e65ae 49 if (bigNibbleVal >= 0x0C)
AzureIoTClient 11:77df6d7e65ae 50 {
AzureIoTClient 11:77df6d7e65ae 51 bigNibbleVal -= 0x04;
AzureIoTClient 11:77df6d7e65ae 52 }
AzureIoTClient 11:77df6d7e65ae 53
AzureIoTClient 11:77df6d7e65ae 54 bigNibbleStr = NIBBLE_STR(bigNibbleVal);
AzureIoTClient 11:77df6d7e65ae 55 littleNibbleStr = NIBBLE_STR(littleNibbleVal);
AzureIoTClient 11:77df6d7e65ae 56
AzureIoTClient 11:77df6d7e65ae 57 buffer[0] = '%';
AzureIoTClient 11:77df6d7e65ae 58
AzureIoTClient 11:77df6d7e65ae 59 if (charVal < 0x80)
AzureIoTClient 11:77df6d7e65ae 60 {
AzureIoTClient 11:77df6d7e65ae 61 buffer[1] = bigNibbleStr;
AzureIoTClient 11:77df6d7e65ae 62 buffer[2] = littleNibbleStr;
AzureIoTClient 11:77df6d7e65ae 63 size = 3;
AzureIoTClient 11:77df6d7e65ae 64 }
AzureIoTClient 11:77df6d7e65ae 65 else
AzureIoTClient 11:77df6d7e65ae 66 {
AzureIoTClient 11:77df6d7e65ae 67 buffer[1] = 'c';
AzureIoTClient 11:77df6d7e65ae 68 buffer[3] = '%';
AzureIoTClient 11:77df6d7e65ae 69 buffer[4] = bigNibbleStr;
AzureIoTClient 11:77df6d7e65ae 70 buffer[5] = littleNibbleStr;
AzureIoTClient 11:77df6d7e65ae 71 if (charVal < 0xC0)
AzureIoTClient 11:77df6d7e65ae 72 {
AzureIoTClient 11:77df6d7e65ae 73 buffer[2] = '2';
AzureIoTClient 11:77df6d7e65ae 74 }
AzureIoTClient 11:77df6d7e65ae 75 else
AzureIoTClient 11:77df6d7e65ae 76 {
AzureIoTClient 11:77df6d7e65ae 77 buffer[2] = '3';
AzureIoTClient 11:77df6d7e65ae 78 }
AzureIoTClient 11:77df6d7e65ae 79 size = 6;
AzureIoTClient 11:77df6d7e65ae 80 }
AzureIoTClient 11:77df6d7e65ae 81 }
AzureIoTClient 11:77df6d7e65ae 82
AzureIoTClient 11:77df6d7e65ae 83 return size;
AzureIoTClient 11:77df6d7e65ae 84 }
AzureIoTClient 11:77df6d7e65ae 85
AzureIoTClient 11:77df6d7e65ae 86 static size_t URL_PrintableCharSize(unsigned char charVal)
AzureIoTClient 11:77df6d7e65ae 87 {
AzureIoTClient 11:77df6d7e65ae 88 size_t size;
AzureIoTClient 11:77df6d7e65ae 89 if (IS_PRINTABLE(charVal))
AzureIoTClient 11:77df6d7e65ae 90 {
AzureIoTClient 11:77df6d7e65ae 91 size = 1;
AzureIoTClient 11:77df6d7e65ae 92 }
AzureIoTClient 11:77df6d7e65ae 93 else
AzureIoTClient 11:77df6d7e65ae 94 {
AzureIoTClient 11:77df6d7e65ae 95 if (charVal < 0x80)
AzureIoTClient 11:77df6d7e65ae 96 {
AzureIoTClient 11:77df6d7e65ae 97 size = 3;
AzureIoTClient 11:77df6d7e65ae 98 }
AzureIoTClient 11:77df6d7e65ae 99 else
AzureIoTClient 11:77df6d7e65ae 100 {
AzureIoTClient 11:77df6d7e65ae 101 size = 6;
AzureIoTClient 11:77df6d7e65ae 102 }
AzureIoTClient 11:77df6d7e65ae 103 }
AzureIoTClient 11:77df6d7e65ae 104 return size;
AzureIoTClient 11:77df6d7e65ae 105 }
Azure.IoT Build 0:fa2de1b79154 106
Azure.IoT Build 0:fa2de1b79154 107 STRING_HANDLE URL_EncodeString(const char* textEncode)
Azure.IoT Build 0:fa2de1b79154 108 {
Azure.IoT Build 0:fa2de1b79154 109 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 110 if (textEncode == NULL)
Azure.IoT Build 0:fa2de1b79154 111 {
Azure.IoT Build 0:fa2de1b79154 112 result = NULL;
Azure.IoT Build 0:fa2de1b79154 113 }
Azure.IoT Build 0:fa2de1b79154 114 else
Azure.IoT Build 0:fa2de1b79154 115 {
Azure.IoT Build 0:fa2de1b79154 116 STRING_HANDLE tempString = STRING_construct(textEncode);
Azure.IoT Build 0:fa2de1b79154 117 if (tempString == NULL)
Azure.IoT Build 0:fa2de1b79154 118 {
Azure.IoT Build 0:fa2de1b79154 119 result = NULL;
Azure.IoT Build 0:fa2de1b79154 120 }
Azure.IoT Build 0:fa2de1b79154 121 else
Azure.IoT Build 0:fa2de1b79154 122 {
Azure.IoT Build 0:fa2de1b79154 123 result = URL_Encode(tempString);
Azure.IoT Build 0:fa2de1b79154 124 STRING_delete(tempString);
Azure.IoT Build 0:fa2de1b79154 125 }
Azure.IoT Build 0:fa2de1b79154 126 }
Azure.IoT Build 0:fa2de1b79154 127 return result;
Azure.IoT Build 0:fa2de1b79154 128 }
Azure.IoT Build 0:fa2de1b79154 129
Azure.IoT Build 0:fa2de1b79154 130 STRING_HANDLE URL_Encode(STRING_HANDLE input)
Azure.IoT Build 0:fa2de1b79154 131 {
Azure.IoT Build 0:fa2de1b79154 132 STRING_HANDLE result;
Azure.IoT Build 0:fa2de1b79154 133 if (input == NULL)
Azure.IoT Build 0:fa2de1b79154 134 {
Azure.IoT Build 0:fa2de1b79154 135 /*Codes_SRS_URL_ENCODE_06_001: [If input is NULL then URL_Encode will return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 136 result = NULL;
AzureIoTClient 1:9190c0f4d23a 137 LogError("URL_Encode:: NULL input");
Azure.IoT Build 0:fa2de1b79154 138 }
Azure.IoT Build 0:fa2de1b79154 139 else
Azure.IoT Build 0:fa2de1b79154 140 {
Azure.IoT Build 0:fa2de1b79154 141 size_t lengthOfResult = 0;
Azure.IoT Build 0:fa2de1b79154 142 char* encodedURL;
Azure.IoT Build 0:fa2de1b79154 143 const char* currentInput;
Azure.IoT Build 0:fa2de1b79154 144 unsigned char currentUnsignedChar;
Azure.IoT Build 0:fa2de1b79154 145 currentInput = STRING_c_str(input);
Azure.IoT Build 0:fa2de1b79154 146 /*Codes_SRS_URL_ENCODE_06_003: [If input is a zero length string then URL_Encode will return a zero length string.]*/
Azure.IoT Build 0:fa2de1b79154 147 do
Azure.IoT Build 0:fa2de1b79154 148 {
Azure.IoT Build 0:fa2de1b79154 149 currentUnsignedChar = (unsigned char)(*currentInput++);
AzureIoTClient 11:77df6d7e65ae 150 lengthOfResult += URL_PrintableCharSize(currentUnsignedChar);
Azure.IoT Build 0:fa2de1b79154 151 } while (currentUnsignedChar != 0);
Azure.IoT Build 0:fa2de1b79154 152 if ((encodedURL = malloc(lengthOfResult)) == NULL)
Azure.IoT Build 0:fa2de1b79154 153 {
Azure.IoT Build 0:fa2de1b79154 154 /*Codes_SRS_URL_ENCODE_06_002: [If an error occurs during the encoding of input then URL_Encode will return NULL.]*/
Azure.IoT Build 0:fa2de1b79154 155 result = NULL;
AzureIoTClient 1:9190c0f4d23a 156 LogError("URL_Encode:: MALLOC failure on encode.");
Azure.IoT Build 0:fa2de1b79154 157 }
Azure.IoT Build 0:fa2de1b79154 158 else
Azure.IoT Build 0:fa2de1b79154 159 {
Azure.IoT Build 0:fa2de1b79154 160 size_t currentEncodePosition = 0;
Azure.IoT Build 0:fa2de1b79154 161 currentInput = STRING_c_str(input);
Azure.IoT Build 0:fa2de1b79154 162 do
Azure.IoT Build 0:fa2de1b79154 163 {
Azure.IoT Build 0:fa2de1b79154 164 currentUnsignedChar = (unsigned char)(*currentInput++);
AzureIoTClient 11:77df6d7e65ae 165 currentEncodePosition += URL_PrintableChar(currentUnsignedChar, &encodedURL[currentEncodePosition]);
Azure.IoT Build 0:fa2de1b79154 166 } while (currentUnsignedChar != 0);
AzureIoTClient 11:77df6d7e65ae 167
Azure.IoT Build 0:fa2de1b79154 168 result = STRING_new_with_memory(encodedURL);
AzureIoTClient 11:77df6d7e65ae 169 if (result == NULL)
AzureIoTClient 11:77df6d7e65ae 170 {
AzureIoTClient 11:77df6d7e65ae 171 LogError("URL_Encode:: MALLOC failure on encode.");
AzureIoTClient 11:77df6d7e65ae 172 free(encodedURL);
AzureIoTClient 11:77df6d7e65ae 173 }
Azure.IoT Build 0:fa2de1b79154 174 }
Azure.IoT Build 0:fa2de1b79154 175 }
Azure.IoT Build 0:fa2de1b79154 176 return result;
Azure.IoT Build 0:fa2de1b79154 177 }