Fork of mbed-http

Fork of mbed-http by sandbox

Committer:
Jan Jongboom
Date:
Thu Feb 23 13:28:07 2017 +0100
Revision:
3:8a6b003e3874
Parent:
0:910f5949759f
Child:
4:539df159e058
Rely on Content-Length header to determine when request is processed

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 3:8a6b003e3874 33 body_length = 0;
Jan Jongboom 0:910f5949759f 34 }
Jan Jongboom 0:910f5949759f 35
Jan Jongboom 0:910f5949759f 36 void set_status(int a_status_code, string a_status_message) {
Jan Jongboom 0:910f5949759f 37 status_code = a_status_code;
Jan Jongboom 0:910f5949759f 38 status_message = a_status_message;
Jan Jongboom 0:910f5949759f 39 }
Jan Jongboom 0:910f5949759f 40
Jan Jongboom 0:910f5949759f 41 int get_status_code() {
Jan Jongboom 0:910f5949759f 42 return status_code;
Jan Jongboom 0:910f5949759f 43 }
Jan Jongboom 0:910f5949759f 44
Jan Jongboom 0:910f5949759f 45 string get_status_message() {
Jan Jongboom 0:910f5949759f 46 return status_message;
Jan Jongboom 0:910f5949759f 47 }
Jan Jongboom 0:910f5949759f 48
Jan Jongboom 0:910f5949759f 49 void set_header_field(string field) {
Jan Jongboom 0:910f5949759f 50 concat_header_value = false;
Jan Jongboom 0:910f5949759f 51
Jan Jongboom 0:910f5949759f 52 // headers can be chunked
Jan Jongboom 0:910f5949759f 53 if (concat_header_field) {
Jan Jongboom 0:910f5949759f 54 header_fields[header_fields.size() - 1] = header_fields[header_fields.size() - 1] + field;
Jan Jongboom 0:910f5949759f 55 }
Jan Jongboom 0:910f5949759f 56 else {
Jan Jongboom 0:910f5949759f 57 header_fields.push_back(field);
Jan Jongboom 0:910f5949759f 58 }
Jan Jongboom 0:910f5949759f 59
Jan Jongboom 0:910f5949759f 60 concat_header_field = true;
Jan Jongboom 0:910f5949759f 61 }
Jan Jongboom 0:910f5949759f 62
Jan Jongboom 0:910f5949759f 63 void set_header_value(string value) {
Jan Jongboom 0:910f5949759f 64 concat_header_field = false;
Jan Jongboom 0:910f5949759f 65
Jan Jongboom 0:910f5949759f 66 // headers can be chunked
Jan Jongboom 0:910f5949759f 67 if (concat_header_value) {
Jan Jongboom 0:910f5949759f 68 header_values[header_values.size() - 1] = header_values[header_values.size() - 1] + value;
Jan Jongboom 0:910f5949759f 69 }
Jan Jongboom 0:910f5949759f 70 else {
Jan Jongboom 0:910f5949759f 71 header_values.push_back(value);
Jan Jongboom 0:910f5949759f 72 }
Jan Jongboom 0:910f5949759f 73
Jan Jongboom 0:910f5949759f 74 concat_header_value = true;
Jan Jongboom 0:910f5949759f 75 }
Jan Jongboom 0:910f5949759f 76
Jan Jongboom 3:8a6b003e3874 77 void set_headers_complete() {
Jan Jongboom 3:8a6b003e3874 78 // @todo: chunked encoding
Jan Jongboom 3:8a6b003e3874 79 for (size_t ix = 0; ix < header_fields.size(); ix++) {
Jan Jongboom 3:8a6b003e3874 80 if (strcicmp(header_fields[ix].c_str(), "content-length") == 0) {
Jan Jongboom 3:8a6b003e3874 81 expected_content_length = (size_t)atoi(header_values[ix].c_str());
Jan Jongboom 3:8a6b003e3874 82 break;
Jan Jongboom 3:8a6b003e3874 83 }
Jan Jongboom 3:8a6b003e3874 84 }
Jan Jongboom 3:8a6b003e3874 85 }
Jan Jongboom 3:8a6b003e3874 86
Jan Jongboom 0:910f5949759f 87 size_t get_headers_length() {
Jan Jongboom 0:910f5949759f 88 return header_fields.size();
Jan Jongboom 0:910f5949759f 89 }
Jan Jongboom 0:910f5949759f 90
Jan Jongboom 0:910f5949759f 91 vector<string> get_headers_fields() {
Jan Jongboom 0:910f5949759f 92 return header_fields;
Jan Jongboom 0:910f5949759f 93 }
Jan Jongboom 0:910f5949759f 94
Jan Jongboom 0:910f5949759f 95 vector<string> get_headers_values() {
Jan Jongboom 0:910f5949759f 96 return header_values;
Jan Jongboom 0:910f5949759f 97 }
Jan Jongboom 0:910f5949759f 98
Jan Jongboom 0:910f5949759f 99 void set_body(string v) {
Jan Jongboom 0:910f5949759f 100 body = body + v;
Jan Jongboom 0:910f5949759f 101 }
Jan Jongboom 0:910f5949759f 102
Jan Jongboom 0:910f5949759f 103 string get_body() {
Jan Jongboom 0:910f5949759f 104 return body;
Jan Jongboom 0:910f5949759f 105 }
Jan Jongboom 0:910f5949759f 106
Jan Jongboom 3:8a6b003e3874 107 void increase_body_length(size_t length) {
Jan Jongboom 3:8a6b003e3874 108 body_length += length;
Jan Jongboom 3:8a6b003e3874 109 }
Jan Jongboom 3:8a6b003e3874 110
Jan Jongboom 3:8a6b003e3874 111 bool is_body_complete() {
Jan Jongboom 3:8a6b003e3874 112 return body_length == expected_content_length;
Jan Jongboom 3:8a6b003e3874 113 }
Jan Jongboom 3:8a6b003e3874 114
Jan Jongboom 0:910f5949759f 115 private:
Jan Jongboom 3:8a6b003e3874 116 // from http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c
Jan Jongboom 3:8a6b003e3874 117 int strcicmp(char const *a, char const *b) {
Jan Jongboom 3:8a6b003e3874 118 for (;; a++, b++) {
Jan Jongboom 3:8a6b003e3874 119 int d = tolower(*a) - tolower(*b);
Jan Jongboom 3:8a6b003e3874 120 if (d != 0 || !*a) {
Jan Jongboom 3:8a6b003e3874 121 return d;
Jan Jongboom 3:8a6b003e3874 122 }
Jan Jongboom 3:8a6b003e3874 123 }
Jan Jongboom 3:8a6b003e3874 124 }
Jan Jongboom 3:8a6b003e3874 125
Jan Jongboom 0:910f5949759f 126 int status_code;
Jan Jongboom 0:910f5949759f 127 string status_message;
Jan Jongboom 0:910f5949759f 128
Jan Jongboom 0:910f5949759f 129 vector<string> header_fields;
Jan Jongboom 0:910f5949759f 130 vector<string> header_values;
Jan Jongboom 0:910f5949759f 131
Jan Jongboom 0:910f5949759f 132 bool concat_header_field;
Jan Jongboom 0:910f5949759f 133 bool concat_header_value;
Jan Jongboom 0:910f5949759f 134
Jan Jongboom 3:8a6b003e3874 135 size_t expected_content_length;
Jan Jongboom 3:8a6b003e3874 136
Jan Jongboom 0:910f5949759f 137 string body;
Jan Jongboom 3:8a6b003e3874 138 size_t body_length;
Jan Jongboom 0:910f5949759f 139 };
Jan Jongboom 0:910f5949759f 140 #endif