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.
Fork of mbed-http by
source/http_response.h@18:f7a85895a941, 2017-09-04 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Mon Sep 04 16:31:38 2017 +0100
- Revision:
- 18:f7a85895a941
- Parent:
- 15:ffc77f212382
tls_socket was leaking 1024 bytes of memory
Who changed what in which revision?
| User | Revision | Line number | New 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 |
