ban4jp - / iSDIO

Dependencies:   SDFileSystem

Dependents:   FlashAir_Twitter Neon_F303K8_04

Fork of HTTPClient by Donatien Garnier

Committer:
ban4jp
Date:
Sun Dec 14 19:05:31 2014 +0000
Revision:
19:3b1625dbd7e9
Parent:
16:1f743885e7de
Format code.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:2ccb9960a044 1 /* HTTPMap.cpp */
donatien 10:e1351de84c16 2 /* Copyright (C) 2012 mbed.org, MIT License
donatien 10:e1351de84c16 3 *
donatien 10:e1351de84c16 4 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 10:e1351de84c16 5 * and associated documentation files (the "Software"), to deal in the Software without restriction,
donatien 10:e1351de84c16 6 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
donatien 10:e1351de84c16 7 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
donatien 10:e1351de84c16 8 * furnished to do so, subject to the following conditions:
donatien 10:e1351de84c16 9 *
donatien 10:e1351de84c16 10 * The above copyright notice and this permission notice shall be included in all copies or
donatien 10:e1351de84c16 11 * substantial portions of the Software.
donatien 10:e1351de84c16 12 *
donatien 10:e1351de84c16 13 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 10:e1351de84c16 14 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 10:e1351de84c16 15 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 10:e1351de84c16 16 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 10:e1351de84c16 17 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 10:e1351de84c16 18 */
donatien 0:2ccb9960a044 19
donatien 0:2ccb9960a044 20 #include "HTTPMap.h"
donatien 0:2ccb9960a044 21
donatien 0:2ccb9960a044 22 #include <cstring>
donatien 0:2ccb9960a044 23
donatien 0:2ccb9960a044 24 #include <cctype>
donatien 0:2ccb9960a044 25
donatien 13:be61104f4e91 26 #define OK 0
donatien 13:be61104f4e91 27
donatien 13:be61104f4e91 28 using std::strncpy;
donatien 13:be61104f4e91 29
donatien 0:2ccb9960a044 30 HTTPMap::HTTPMap() : m_pos(0), m_count(0)
donatien 0:2ccb9960a044 31 {
donatien 0:2ccb9960a044 32
donatien 0:2ccb9960a044 33 }
donatien 0:2ccb9960a044 34
donatien 0:2ccb9960a044 35 void HTTPMap::put(const char* key, const char* value)
donatien 0:2ccb9960a044 36 {
ban4jp 19:3b1625dbd7e9 37 if(m_count >= HTTPMAP_TABLE_SIZE) {
ban4jp 19:3b1625dbd7e9 38 return;
ban4jp 19:3b1625dbd7e9 39 }
ban4jp 19:3b1625dbd7e9 40 m_keys[m_count] = key;
ban4jp 19:3b1625dbd7e9 41 m_values[m_count] = value;
ban4jp 19:3b1625dbd7e9 42 m_count++;
donatien 0:2ccb9960a044 43 }
donatien 0:2ccb9960a044 44
donatien 0:2ccb9960a044 45 void HTTPMap::clear()
donatien 0:2ccb9960a044 46 {
ban4jp 19:3b1625dbd7e9 47 m_count = 0;
ban4jp 19:3b1625dbd7e9 48 m_pos = 0;
donatien 0:2ccb9960a044 49 }
donatien 0:2ccb9960a044 50
donatien 16:1f743885e7de 51 /*virtual*/ void HTTPMap::readReset()
donatien 16:1f743885e7de 52 {
ban4jp 19:3b1625dbd7e9 53 m_pos = 0;
donatien 16:1f743885e7de 54 }
donatien 0:2ccb9960a044 55
donatien 0:2ccb9960a044 56 /*virtual*/ int HTTPMap::read(char* buf, size_t len, size_t* pReadLen)
donatien 0:2ccb9960a044 57 {
ban4jp 19:3b1625dbd7e9 58 if(m_pos >= m_count) {
ban4jp 19:3b1625dbd7e9 59 *pReadLen = 0;
ban4jp 19:3b1625dbd7e9 60 m_pos = 0;
ban4jp 19:3b1625dbd7e9 61 return OK;
ban4jp 19:3b1625dbd7e9 62 }
donatien 0:2ccb9960a044 63
ban4jp 19:3b1625dbd7e9 64 //URL encode
ban4jp 19:3b1625dbd7e9 65 char* out = buf;
ban4jp 19:3b1625dbd7e9 66 const char* in = m_keys[m_pos];
ban4jp 19:3b1625dbd7e9 67 if( (m_pos != 0) && (out - buf < len - 1) ) {
ban4jp 19:3b1625dbd7e9 68 *out='&';
ban4jp 19:3b1625dbd7e9 69 out++;
donatien 0:2ccb9960a044 70 }
donatien 0:2ccb9960a044 71
ban4jp 19:3b1625dbd7e9 72 while( (*in != '\0') && (out - buf < len - 3) ) {
ban4jp 19:3b1625dbd7e9 73 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~') {
ban4jp 19:3b1625dbd7e9 74 *out = *in;
ban4jp 19:3b1625dbd7e9 75 out++;
ban4jp 19:3b1625dbd7e9 76 } else if( *in == ' ' ) {
ban4jp 19:3b1625dbd7e9 77 *out='+';
ban4jp 19:3b1625dbd7e9 78 out++;
ban4jp 19:3b1625dbd7e9 79 } else {
ban4jp 19:3b1625dbd7e9 80 char hex[] = "0123456789abcdef";
ban4jp 19:3b1625dbd7e9 81 *out='%';
ban4jp 19:3b1625dbd7e9 82 out++;
ban4jp 19:3b1625dbd7e9 83 *out=hex[(*in>>4)&0xf];
ban4jp 19:3b1625dbd7e9 84 out++;
ban4jp 19:3b1625dbd7e9 85 *out=hex[(*in)&0xf];
ban4jp 19:3b1625dbd7e9 86 out++;
ban4jp 19:3b1625dbd7e9 87 }
ban4jp 19:3b1625dbd7e9 88 in++;
ban4jp 19:3b1625dbd7e9 89 }
donatien 0:2ccb9960a044 90
ban4jp 19:3b1625dbd7e9 91 if( out - buf < len - 1 ) {
ban4jp 19:3b1625dbd7e9 92 *out='=';
ban4jp 19:3b1625dbd7e9 93 out++;
donatien 0:2ccb9960a044 94 }
ban4jp 19:3b1625dbd7e9 95
ban4jp 19:3b1625dbd7e9 96 in = m_values[m_pos];
ban4jp 19:3b1625dbd7e9 97 while( (*in != '\0') && (out - buf < len - 3) ) {
ban4jp 19:3b1625dbd7e9 98 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~') {
ban4jp 19:3b1625dbd7e9 99 *out = *in;
ban4jp 19:3b1625dbd7e9 100 out++;
ban4jp 19:3b1625dbd7e9 101 } else if( *in == ' ' ) {
ban4jp 19:3b1625dbd7e9 102 *out='+';
ban4jp 19:3b1625dbd7e9 103 out++;
ban4jp 19:3b1625dbd7e9 104 } else {
ban4jp 19:3b1625dbd7e9 105 char hex[] = "0123456789abcdef";
ban4jp 19:3b1625dbd7e9 106 *out='%';
ban4jp 19:3b1625dbd7e9 107 out++;
ban4jp 19:3b1625dbd7e9 108 *out=hex[(*in>>4)&0xf];
ban4jp 19:3b1625dbd7e9 109 out++;
ban4jp 19:3b1625dbd7e9 110 *out=hex[(*in)&0xf];
ban4jp 19:3b1625dbd7e9 111 out++;
ban4jp 19:3b1625dbd7e9 112 }
ban4jp 19:3b1625dbd7e9 113 in++;
donatien 0:2ccb9960a044 114 }
ban4jp 19:3b1625dbd7e9 115
ban4jp 19:3b1625dbd7e9 116 *pReadLen = out - buf;
donatien 0:2ccb9960a044 117
ban4jp 19:3b1625dbd7e9 118 m_pos++;
ban4jp 19:3b1625dbd7e9 119 return OK;
donatien 0:2ccb9960a044 120 }
donatien 0:2ccb9960a044 121
donatien 0:2ccb9960a044 122 /*virtual*/ int HTTPMap::getDataType(char* type, size_t maxTypeLen) //Internet media type for Content-Type header
donatien 0:2ccb9960a044 123 {
ban4jp 19:3b1625dbd7e9 124 strncpy(type, "application/x-www-form-urlencoded", maxTypeLen-1);
ban4jp 19:3b1625dbd7e9 125 type[maxTypeLen-1] = '\0';
ban4jp 19:3b1625dbd7e9 126 return OK;
donatien 0:2ccb9960a044 127 }
donatien 0:2ccb9960a044 128
donatien 0:2ccb9960a044 129 /*virtual*/ bool HTTPMap::getIsChunked() //For Transfer-Encoding header
donatien 0:2ccb9960a044 130 {
ban4jp 19:3b1625dbd7e9 131 return false; ////Data is computed one key/value pair at a time
donatien 0:2ccb9960a044 132 }
donatien 0:2ccb9960a044 133
donatien 0:2ccb9960a044 134 /*virtual*/ size_t HTTPMap::getDataLen() //For Content-Length header
donatien 0:2ccb9960a044 135 {
ban4jp 19:3b1625dbd7e9 136 size_t count = 0;
ban4jp 19:3b1625dbd7e9 137 for(size_t i = 0; i< m_count; i++) {
ban4jp 19:3b1625dbd7e9 138 //URL encode
ban4jp 19:3b1625dbd7e9 139 const char* in = m_keys[i];
ban4jp 19:3b1625dbd7e9 140 if( i != 0 ) {
ban4jp 19:3b1625dbd7e9 141 count++;
ban4jp 19:3b1625dbd7e9 142 }
donatien 0:2ccb9960a044 143
ban4jp 19:3b1625dbd7e9 144 while( (*in != '\0') ) {
ban4jp 19:3b1625dbd7e9 145 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~') {
ban4jp 19:3b1625dbd7e9 146 count++;
ban4jp 19:3b1625dbd7e9 147 } else if( *in == ' ' ) {
ban4jp 19:3b1625dbd7e9 148 count++;
ban4jp 19:3b1625dbd7e9 149 } else {
ban4jp 19:3b1625dbd7e9 150 count+=3;
ban4jp 19:3b1625dbd7e9 151 }
ban4jp 19:3b1625dbd7e9 152 in++;
ban4jp 19:3b1625dbd7e9 153 }
donatien 0:2ccb9960a044 154
ban4jp 19:3b1625dbd7e9 155 count ++;
donatien 0:2ccb9960a044 156
ban4jp 19:3b1625dbd7e9 157 in = m_values[i];
ban4jp 19:3b1625dbd7e9 158 while( (*in != '\0') ) {
ban4jp 19:3b1625dbd7e9 159 if (std::isalnum(*in) || *in == '-' || *in == '_' || *in == '.' || *in == '~') {
ban4jp 19:3b1625dbd7e9 160 count++;
ban4jp 19:3b1625dbd7e9 161 } else if( *in == ' ' ) {
ban4jp 19:3b1625dbd7e9 162 count++;
ban4jp 19:3b1625dbd7e9 163 } else {
ban4jp 19:3b1625dbd7e9 164 count+=3;
ban4jp 19:3b1625dbd7e9 165 }
ban4jp 19:3b1625dbd7e9 166 in++;
ban4jp 19:3b1625dbd7e9 167 }
donatien 0:2ccb9960a044 168 }
ban4jp 19:3b1625dbd7e9 169 return count;
donatien 0:2ccb9960a044 170 }