mbed-http

Fork of mbed-http by sandbox

Committer:
ksekimoto
Date:
Tue Jan 02 16:00:05 2018 +0000
Revision:
22:fb5e4bc49534
Parent:
18:f7a85895a941
Change http-buffer-size for GR-PEACH

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jan Jongboom 0:910f5949759f 1 /*
Jan Jongboom 0:910f5949759f 2 * PackageLicenseDeclared: Apache-2.0
Jan Jongboom 0:910f5949759f 3 * Copyright (c) 2017 ARM Limited
Jan Jongboom 0:910f5949759f 4 *
Jan Jongboom 0:910f5949759f 5 * Licensed under the Apache License, Version 2.0 (the "License");
Jan Jongboom 0:910f5949759f 6 * you may not use this file except in compliance with the License.
Jan Jongboom 0:910f5949759f 7 * You may obtain a copy of the License at
Jan Jongboom 0:910f5949759f 8 *
Jan Jongboom 0:910f5949759f 9 * http://www.apache.org/licenses/LICENSE-2.0
Jan Jongboom 0:910f5949759f 10 *
Jan Jongboom 0:910f5949759f 11 * Unless required by applicable law or agreed to in writing, software
Jan Jongboom 0:910f5949759f 12 * distributed under the License is distributed on an "AS IS" BASIS,
Jan Jongboom 0:910f5949759f 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Jan Jongboom 0:910f5949759f 14 * See the License for the specific language governing permissions and
Jan Jongboom 0:910f5949759f 15 * limitations under the License.
Jan Jongboom 0:910f5949759f 16 */
Jan Jongboom 0:910f5949759f 17
Jan Jongboom 0:910f5949759f 18 #ifndef _MBED_HTTP_HTTP_RESPONSE
Jan Jongboom 0:910f5949759f 19 #define _MBED_HTTP_HTTP_RESPONSE
Jan Jongboom 0:910f5949759f 20 #include <string>
Jan Jongboom 0:910f5949759f 21 #include <vector>
Jan Jongboom 0:910f5949759f 22 #include "http_parser.h"
Jan Jongboom 0:910f5949759f 23
Jan Jongboom 0:910f5949759f 24 using namespace std;
Jan Jongboom 0:910f5949759f 25
Jan Jongboom 0:910f5949759f 26 class HttpResponse {
Jan Jongboom 0:910f5949759f 27 public:
Jan Jongboom 0:910f5949759f 28 HttpResponse() {
Jan Jongboom 0:910f5949759f 29 status_code = 0;
Jan Jongboom 0:910f5949759f 30 concat_header_field = false;
Jan Jongboom 0:910f5949759f 31 concat_header_value = false;
Jan Jongboom 3:8a6b003e3874 32 expected_content_length = 0;
Jan Jongboom 7:2e3eedb9ca5c 33 is_chunked = false;
Jan Jongboom 7:2e3eedb9ca5c 34 is_message_completed = false;
Jan Jongboom 3:8a6b003e3874 35 body_length = 0;
Jan Jongboom 4:539df159e058 36 body_offset = 0;
Jan Jongboom 4:539df159e058 37 body = NULL;
Jan Jongboom 4:539df159e058 38 }
Jan Jongboom 4:539df159e058 39
Jan Jongboom 4:539df159e058 40 ~HttpResponse() {
Jan Jongboom 4:539df159e058 41 if (body != NULL) {
Jan Jongboom 4:539df159e058 42 free(body);
Jan Jongboom 4:539df159e058 43 }
Jan Jongboom 7:2e3eedb9ca5c 44
Jan Jongboom 7:2e3eedb9ca5c 45 for (size_t ix = 0; ix < header_fields.size(); ix++) {
Jan Jongboom 7:2e3eedb9ca5c 46 delete header_fields[ix];
Jan Jongboom 7:2e3eedb9ca5c 47 delete header_values[ix];
Jan Jongboom 7:2e3eedb9ca5c 48 }
Jan Jongboom 0:910f5949759f 49 }
Jan Jongboom 0:910f5949759f 50
Jan Jongboom 0:910f5949759f 51 void set_status(int a_status_code, string a_status_message) {
Jan Jongboom 0:910f5949759f 52 status_code = a_status_code;
Jan Jongboom 0:910f5949759f 53 status_message = a_status_message;
Jan Jongboom 0:910f5949759f 54 }
Jan Jongboom 0:910f5949759f 55
Jan Jongboom 0:910f5949759f 56 int get_status_code() {
Jan Jongboom 0:910f5949759f 57 return status_code;
Jan Jongboom 0:910f5949759f 58 }
Jan Jongboom 0:910f5949759f 59
Jan Jongboom 0:910f5949759f 60 string get_status_message() {
Jan Jongboom 0:910f5949759f 61 return status_message;
Jan Jongboom 0:910f5949759f 62 }
Jan Jongboom 0:910f5949759f 63
Jan Jongboom 15:ffc77f212382 64 void set_url(string a_url) {
Jan Jongboom 15:ffc77f212382 65 url = a_url;
Jan Jongboom 15:ffc77f212382 66 }
Jan Jongboom 15:ffc77f212382 67
Jan Jongboom 15:ffc77f212382 68 string get_url() {
Jan Jongboom 15:ffc77f212382 69 return url;
Jan Jongboom 15:ffc77f212382 70 }
Jan Jongboom 15:ffc77f212382 71
Jan Jongboom 15:ffc77f212382 72 void set_method(http_method a_method) {
Jan Jongboom 15:ffc77f212382 73 method = a_method;
Jan Jongboom 15:ffc77f212382 74 }
Jan Jongboom 15:ffc77f212382 75
Jan Jongboom 15:ffc77f212382 76 http_method get_method() {
Jan Jongboom 15:ffc77f212382 77 return method;
Jan Jongboom 15:ffc77f212382 78 }
Jan Jongboom 15:ffc77f212382 79
Jan Jongboom 0:910f5949759f 80 void set_header_field(string field) {
Jan Jongboom 0:910f5949759f 81 concat_header_value = false;
Jan Jongboom 0:910f5949759f 82
Jan Jongboom 0:910f5949759f 83 // headers can be chunked
Jan Jongboom 0:910f5949759f 84 if (concat_header_field) {
Jan Jongboom 7:2e3eedb9ca5c 85 *header_fields[header_fields.size() - 1] = (*header_fields[header_fields.size() - 1]) + field;
Jan Jongboom 0:910f5949759f 86 }
Jan Jongboom 0:910f5949759f 87 else {
Jan Jongboom 7:2e3eedb9ca5c 88 header_fields.push_back(new string(field));
Jan Jongboom 0:910f5949759f 89 }
Jan Jongboom 0:910f5949759f 90
Jan Jongboom 0:910f5949759f 91 concat_header_field = true;
Jan Jongboom 0:910f5949759f 92 }
Jan Jongboom 0:910f5949759f 93
Jan Jongboom 0:910f5949759f 94 void set_header_value(string value) {
Jan Jongboom 0:910f5949759f 95 concat_header_field = false;
Jan Jongboom 0:910f5949759f 96
Jan Jongboom 0:910f5949759f 97 // headers can be chunked
Jan Jongboom 0:910f5949759f 98 if (concat_header_value) {
Jan Jongboom 7:2e3eedb9ca5c 99 *header_values[header_values.size() - 1] = (*header_values[header_values.size() - 1]) + value;
Jan Jongboom 0:910f5949759f 100 }
Jan Jongboom 0:910f5949759f 101 else {
Jan Jongboom 7:2e3eedb9ca5c 102 header_values.push_back(new string(value));
Jan Jongboom 0:910f5949759f 103 }
Jan Jongboom 0:910f5949759f 104
Jan Jongboom 0:910f5949759f 105 concat_header_value = true;
Jan Jongboom 0:910f5949759f 106 }
Jan Jongboom 0:910f5949759f 107
Jan Jongboom 3:8a6b003e3874 108 void set_headers_complete() {
Jan Jongboom 3:8a6b003e3874 109 for (size_t ix = 0; ix < header_fields.size(); ix++) {
Jan Jongboom 7:2e3eedb9ca5c 110 if (strcicmp(header_fields[ix]->c_str(), "content-length") == 0) {
Jan Jongboom 7:2e3eedb9ca5c 111 expected_content_length = (size_t)atoi(header_values[ix]->c_str());
Jan Jongboom 3:8a6b003e3874 112 break;
Jan Jongboom 3:8a6b003e3874 113 }
Jan Jongboom 3:8a6b003e3874 114 }
Jan Jongboom 3:8a6b003e3874 115 }
Jan Jongboom 3:8a6b003e3874 116
Jan Jongboom 0:910f5949759f 117 size_t get_headers_length() {
Jan Jongboom 0:910f5949759f 118 return header_fields.size();
Jan Jongboom 0:910f5949759f 119 }
Jan Jongboom 0:910f5949759f 120
Jan Jongboom 7:2e3eedb9ca5c 121 vector<string*> get_headers_fields() {
Jan Jongboom 0:910f5949759f 122 return header_fields;
Jan Jongboom 0:910f5949759f 123 }
Jan Jongboom 0:910f5949759f 124
Jan Jongboom 7:2e3eedb9ca5c 125 vector<string*> get_headers_values() {
Jan Jongboom 0:910f5949759f 126 return header_values;
Jan Jongboom 0:910f5949759f 127 }
Jan Jongboom 0:910f5949759f 128
Jan Jongboom 4:539df159e058 129 void set_body(const char *at, size_t length) {
Jan Jongboom 14:3004056e4661 130 // Connection: close, could not specify Content-Length, nor chunked... So do it like this:
Jan Jongboom 14:3004056e4661 131 if (expected_content_length == 0 && length > 0) {
Jan Jongboom 14:3004056e4661 132 is_chunked = true;
Jan Jongboom 14:3004056e4661 133 }
Jan Jongboom 14:3004056e4661 134
Jan Jongboom 4:539df159e058 135 // only malloc when this fn is called, so we don't alloc when body callback's are enabled
Jan Jongboom 7:2e3eedb9ca5c 136 if (body == NULL && !is_chunked) {
Jan Jongboom 4:539df159e058 137 body = (char*)malloc(expected_content_length);
Jan Jongboom 4:539df159e058 138 }
Jan Jongboom 4:539df159e058 139
Jan Jongboom 7:2e3eedb9ca5c 140 if (is_chunked) {
Jan Jongboom 7:2e3eedb9ca5c 141 if (body == NULL) {
Jan Jongboom 7:2e3eedb9ca5c 142 body = (char*)malloc(length);
Jan Jongboom 7:2e3eedb9ca5c 143 }
Jan Jongboom 7:2e3eedb9ca5c 144 else {
Jan Jongboom 18:f7a85895a941 145 char* original_body = body;
Jan Jongboom 7:2e3eedb9ca5c 146 body = (char*)realloc(body, body_offset + length);
Jan Jongboom 18:f7a85895a941 147 if (body == NULL) {
Jan Jongboom 18:f7a85895a941 148 printf("[HttpResponse] realloc for %d bytes failed\n", body_offset + length);
Jan Jongboom 18:f7a85895a941 149 free(original_body);
Jan Jongboom 18:f7a85895a941 150 return;
Jan Jongboom 18:f7a85895a941 151 }
Jan Jongboom 7:2e3eedb9ca5c 152 }
Jan Jongboom 7:2e3eedb9ca5c 153 }
Jan Jongboom 7:2e3eedb9ca5c 154
Jan Jongboom 4:539df159e058 155 memcpy(body + body_offset, at, length);
Jan Jongboom 4:539df159e058 156
Jan Jongboom 4:539df159e058 157 body_offset += length;
Jan Jongboom 0:910f5949759f 158 }
Jan Jongboom 0:910f5949759f 159
Jan Jongboom 4:539df159e058 160 void* get_body() {
Jan Jongboom 4:539df159e058 161 return (void*)body;
Jan Jongboom 4:539df159e058 162 }
Jan Jongboom 4:539df159e058 163
Jan Jongboom 4:539df159e058 164 string get_body_as_string() {
Jan Jongboom 4:539df159e058 165 string s(body, body_offset);
Jan Jongboom 4:539df159e058 166 return s;
Jan Jongboom 0:910f5949759f 167 }
Jan Jongboom 0:910f5949759f 168
Jan Jongboom 3:8a6b003e3874 169 void increase_body_length(size_t length) {
Jan Jongboom 3:8a6b003e3874 170 body_length += length;
Jan Jongboom 3:8a6b003e3874 171 }
Jan Jongboom 3:8a6b003e3874 172
Jan Jongboom 4:539df159e058 173 size_t get_body_length() {
Jan Jongboom 4:539df159e058 174 return body_offset;
Jan Jongboom 4:539df159e058 175 }
Jan Jongboom 4:539df159e058 176
Jan Jongboom 7:2e3eedb9ca5c 177 bool is_message_complete() {
Jan Jongboom 7:2e3eedb9ca5c 178 return is_message_completed;
Jan Jongboom 7:2e3eedb9ca5c 179 }
Jan Jongboom 7:2e3eedb9ca5c 180
Jan Jongboom 7:2e3eedb9ca5c 181 void set_chunked() {
Jan Jongboom 7:2e3eedb9ca5c 182 is_chunked = true;
Jan Jongboom 7:2e3eedb9ca5c 183 }
Jan Jongboom 7:2e3eedb9ca5c 184
Jan Jongboom 7:2e3eedb9ca5c 185 void set_message_complete() {
Jan Jongboom 7:2e3eedb9ca5c 186 is_message_completed = true;
Jan Jongboom 3:8a6b003e3874 187 }
Jan Jongboom 3:8a6b003e3874 188
Jan Jongboom 0:910f5949759f 189 private:
Jan Jongboom 3:8a6b003e3874 190 // from http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c
Jan Jongboom 3:8a6b003e3874 191 int strcicmp(char const *a, char const *b) {
Jan Jongboom 3:8a6b003e3874 192 for (;; a++, b++) {
Jan Jongboom 3:8a6b003e3874 193 int d = tolower(*a) - tolower(*b);
Jan Jongboom 3:8a6b003e3874 194 if (d != 0 || !*a) {
Jan Jongboom 3:8a6b003e3874 195 return d;
Jan Jongboom 3:8a6b003e3874 196 }
Jan Jongboom 3:8a6b003e3874 197 }
Jan Jongboom 3:8a6b003e3874 198 }
Jan Jongboom 3:8a6b003e3874 199
Jan Jongboom 8:6156404278bb 200 char tolower(char c) {
Jan Jongboom 8:6156404278bb 201 if(('A' <= c) && (c <= 'Z')) {
Jan Jongboom 8:6156404278bb 202 return 'a' + (c - 'A');
Jan Jongboom 8:6156404278bb 203 }
Jan Jongboom 8:6156404278bb 204
Jan Jongboom 8:6156404278bb 205 return c;
Jan Jongboom 8:6156404278bb 206 }
Jan Jongboom 8:6156404278bb 207
Jan Jongboom 0:910f5949759f 208 int status_code;
Jan Jongboom 0:910f5949759f 209 string status_message;
Jan Jongboom 15:ffc77f212382 210 string url;
Jan Jongboom 15:ffc77f212382 211 http_method method;
Jan Jongboom 0:910f5949759f 212
Jan Jongboom 7:2e3eedb9ca5c 213 vector<string*> header_fields;
Jan Jongboom 7:2e3eedb9ca5c 214 vector<string*> header_values;
Jan Jongboom 0:910f5949759f 215
Jan Jongboom 0:910f5949759f 216 bool concat_header_field;
Jan Jongboom 0:910f5949759f 217 bool concat_header_value;
Jan Jongboom 0:910f5949759f 218
Jan Jongboom 3:8a6b003e3874 219 size_t expected_content_length;
Jan Jongboom 3:8a6b003e3874 220
Jan Jongboom 7:2e3eedb9ca5c 221 bool is_chunked;
Jan Jongboom 7:2e3eedb9ca5c 222
Jan Jongboom 7:2e3eedb9ca5c 223 bool is_message_completed;
Jan Jongboom 7:2e3eedb9ca5c 224
Jan Jongboom 4:539df159e058 225 char * body;
Jan Jongboom 3:8a6b003e3874 226 size_t body_length;
Jan Jongboom 4:539df159e058 227 size_t body_offset;
Jan Jongboom 0:910f5949759f 228 };
Jan Jongboom 15:ffc77f212382 229
Jan Jongboom 0:910f5949759f 230 #endif