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@3:8a6b003e3874, 2017-02-23 (annotated)
- 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?
| 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 |
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 |
