HTTP and HTTPS library for Mbed OS 5
Dependents: RZ_A2M_Mbed_samples_20201012 RZ_A2M_Mbed_samples
source/http_request_parser.h@29:383e9bfbfbed, 2018-08-10 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Fri Aug 10 11:30:37 2018 +0100
- Revision:
- 29:383e9bfbfbed
- Parent:
- 15:ffc77f212382
Force usage of uint32_t instead of size_t - required for compilation on 64-bit systems
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jan Jongboom |
15:ffc77f212382 | 1 | /* |
Jan Jongboom |
15:ffc77f212382 | 2 | * PackageLicenseDeclared: Apache-2.0 |
Jan Jongboom |
15:ffc77f212382 | 3 | * Copyright (c) 2017 ARM Limited |
Jan Jongboom |
15:ffc77f212382 | 4 | * |
Jan Jongboom |
15:ffc77f212382 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
Jan Jongboom |
15:ffc77f212382 | 6 | * you may not use this file except in compliance with the License. |
Jan Jongboom |
15:ffc77f212382 | 7 | * You may obtain a copy of the License at |
Jan Jongboom |
15:ffc77f212382 | 8 | * |
Jan Jongboom |
15:ffc77f212382 | 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
Jan Jongboom |
15:ffc77f212382 | 10 | * |
Jan Jongboom |
15:ffc77f212382 | 11 | * Unless required by applicable law or agreed to in writing, software |
Jan Jongboom |
15:ffc77f212382 | 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
Jan Jongboom |
15:ffc77f212382 | 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
Jan Jongboom |
15:ffc77f212382 | 14 | * See the License for the specific language governing permissions and |
Jan Jongboom |
15:ffc77f212382 | 15 | * limitations under the License. |
Jan Jongboom |
15:ffc77f212382 | 16 | */ |
Jan Jongboom |
15:ffc77f212382 | 17 | |
Jan Jongboom |
15:ffc77f212382 | 18 | #ifndef _HTTP_RESPONSE_PARSER_H_ |
Jan Jongboom |
15:ffc77f212382 | 19 | #define _HTTP_RESPONSE_PARSER_H_ |
Jan Jongboom |
15:ffc77f212382 | 20 | |
Jan Jongboom |
15:ffc77f212382 | 21 | #include "http_parser.h" |
Jan Jongboom |
15:ffc77f212382 | 22 | #include "http_response.h" |
Jan Jongboom |
15:ffc77f212382 | 23 | |
Jan Jongboom |
15:ffc77f212382 | 24 | class HttpParser { |
Jan Jongboom |
15:ffc77f212382 | 25 | public: |
Jan Jongboom |
15:ffc77f212382 | 26 | |
Jan Jongboom |
29:383e9bfbfbed | 27 | HttpParser(HttpResponse* a_response, http_parser_type parser_type, Callback<void(const char *at, uint32_t length)> a_body_callback = 0) |
Jan Jongboom |
15:ffc77f212382 | 28 | : response(a_response), body_callback(a_body_callback) |
Jan Jongboom |
15:ffc77f212382 | 29 | { |
Jan Jongboom |
15:ffc77f212382 | 30 | settings = new http_parser_settings(); |
Jan Jongboom |
15:ffc77f212382 | 31 | |
Jan Jongboom |
15:ffc77f212382 | 32 | settings->on_message_begin = &HttpParser::on_message_begin_callback; |
Jan Jongboom |
15:ffc77f212382 | 33 | settings->on_url = &HttpParser::on_url_callback; |
Jan Jongboom |
15:ffc77f212382 | 34 | settings->on_status = &HttpParser::on_status_callback; |
Jan Jongboom |
15:ffc77f212382 | 35 | settings->on_header_field = &HttpParser::on_header_field_callback; |
Jan Jongboom |
15:ffc77f212382 | 36 | settings->on_header_value = &HttpParser::on_header_value_callback; |
Jan Jongboom |
15:ffc77f212382 | 37 | settings->on_headers_complete = &HttpParser::on_headers_complete_callback; |
Jan Jongboom |
15:ffc77f212382 | 38 | settings->on_chunk_header = &HttpParser::on_chunk_header_callback; |
Jan Jongboom |
15:ffc77f212382 | 39 | settings->on_chunk_complete = &HttpParser::on_chunk_complete_callback; |
Jan Jongboom |
15:ffc77f212382 | 40 | settings->on_body = &HttpParser::on_body_callback; |
Jan Jongboom |
15:ffc77f212382 | 41 | settings->on_message_complete = &HttpParser::on_message_complete_callback; |
Jan Jongboom |
15:ffc77f212382 | 42 | |
Jan Jongboom |
15:ffc77f212382 | 43 | // Construct the http_parser object |
Jan Jongboom |
15:ffc77f212382 | 44 | parser = new http_parser(); |
Jan Jongboom |
15:ffc77f212382 | 45 | http_parser_init(parser, parser_type); |
Jan Jongboom |
15:ffc77f212382 | 46 | parser->data = (void*)this; |
Jan Jongboom |
15:ffc77f212382 | 47 | } |
Jan Jongboom |
15:ffc77f212382 | 48 | |
Jan Jongboom |
15:ffc77f212382 | 49 | ~HttpParser() { |
Jan Jongboom |
15:ffc77f212382 | 50 | if (parser) { |
Jan Jongboom |
15:ffc77f212382 | 51 | delete parser; |
Jan Jongboom |
15:ffc77f212382 | 52 | } |
Jan Jongboom |
15:ffc77f212382 | 53 | if (settings) { |
Jan Jongboom |
15:ffc77f212382 | 54 | delete settings; |
Jan Jongboom |
15:ffc77f212382 | 55 | } |
Jan Jongboom |
15:ffc77f212382 | 56 | } |
Jan Jongboom |
15:ffc77f212382 | 57 | |
Jan Jongboom |
29:383e9bfbfbed | 58 | uint32_t execute(const char* buffer, uint32_t buffer_size) { |
Jan Jongboom |
15:ffc77f212382 | 59 | return http_parser_execute(parser, settings, buffer, buffer_size); |
Jan Jongboom |
15:ffc77f212382 | 60 | } |
Jan Jongboom |
15:ffc77f212382 | 61 | |
Jan Jongboom |
15:ffc77f212382 | 62 | void finish() { |
Jan Jongboom |
15:ffc77f212382 | 63 | http_parser_execute(parser, settings, NULL, 0); |
Jan Jongboom |
15:ffc77f212382 | 64 | } |
Jan Jongboom |
15:ffc77f212382 | 65 | |
Jan Jongboom |
15:ffc77f212382 | 66 | private: |
Jan Jongboom |
15:ffc77f212382 | 67 | // Member functions |
Jan Jongboom |
15:ffc77f212382 | 68 | int on_message_begin(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 69 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 70 | } |
Jan Jongboom |
15:ffc77f212382 | 71 | |
Jan Jongboom |
29:383e9bfbfbed | 72 | int on_url(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 73 | string s(at, length); |
Jan Jongboom |
15:ffc77f212382 | 74 | response->set_url(s); |
Jan Jongboom |
15:ffc77f212382 | 75 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 76 | } |
Jan Jongboom |
15:ffc77f212382 | 77 | |
Jan Jongboom |
29:383e9bfbfbed | 78 | int on_status(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 79 | string s(at, length); |
Jan Jongboom |
15:ffc77f212382 | 80 | response->set_status(parser->status_code, s); |
Jan Jongboom |
15:ffc77f212382 | 81 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 82 | } |
Jan Jongboom |
15:ffc77f212382 | 83 | |
Jan Jongboom |
29:383e9bfbfbed | 84 | int on_header_field(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 85 | string s(at, length); |
Jan Jongboom |
15:ffc77f212382 | 86 | response->set_header_field(s); |
Jan Jongboom |
15:ffc77f212382 | 87 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 88 | } |
Jan Jongboom |
15:ffc77f212382 | 89 | |
Jan Jongboom |
29:383e9bfbfbed | 90 | int on_header_value(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 91 | string s(at, length); |
Jan Jongboom |
15:ffc77f212382 | 92 | response->set_header_value(s); |
Jan Jongboom |
15:ffc77f212382 | 93 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 94 | } |
Jan Jongboom |
15:ffc77f212382 | 95 | |
Jan Jongboom |
15:ffc77f212382 | 96 | int on_headers_complete(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 97 | response->set_headers_complete(); |
Jan Jongboom |
15:ffc77f212382 | 98 | response->set_method((http_method)parser->method); |
Jan Jongboom |
15:ffc77f212382 | 99 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 100 | } |
Jan Jongboom |
15:ffc77f212382 | 101 | |
Jan Jongboom |
29:383e9bfbfbed | 102 | int on_body(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 103 | response->increase_body_length(length); |
Jan Jongboom |
15:ffc77f212382 | 104 | |
Jan Jongboom |
15:ffc77f212382 | 105 | if (body_callback) { |
Jan Jongboom |
15:ffc77f212382 | 106 | body_callback(at, length); |
Jan Jongboom |
15:ffc77f212382 | 107 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 108 | } |
Jan Jongboom |
15:ffc77f212382 | 109 | |
Jan Jongboom |
15:ffc77f212382 | 110 | response->set_body(at, length); |
Jan Jongboom |
15:ffc77f212382 | 111 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 112 | } |
Jan Jongboom |
15:ffc77f212382 | 113 | |
Jan Jongboom |
15:ffc77f212382 | 114 | int on_message_complete(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 115 | response->set_message_complete(); |
Jan Jongboom |
15:ffc77f212382 | 116 | |
Jan Jongboom |
15:ffc77f212382 | 117 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 118 | } |
Jan Jongboom |
15:ffc77f212382 | 119 | |
Jan Jongboom |
15:ffc77f212382 | 120 | int on_chunk_header(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 121 | response->set_chunked(); |
Jan Jongboom |
15:ffc77f212382 | 122 | |
Jan Jongboom |
15:ffc77f212382 | 123 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 124 | } |
Jan Jongboom |
15:ffc77f212382 | 125 | |
Jan Jongboom |
15:ffc77f212382 | 126 | int on_chunk_complete(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 127 | return 0; |
Jan Jongboom |
15:ffc77f212382 | 128 | } |
Jan Jongboom |
15:ffc77f212382 | 129 | |
Jan Jongboom |
15:ffc77f212382 | 130 | // Static http_parser callback functions |
Jan Jongboom |
15:ffc77f212382 | 131 | static int on_message_begin_callback(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 132 | return ((HttpParser*)parser->data)->on_message_begin(parser); |
Jan Jongboom |
15:ffc77f212382 | 133 | } |
Jan Jongboom |
15:ffc77f212382 | 134 | |
Jan Jongboom |
29:383e9bfbfbed | 135 | static int on_url_callback(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 136 | return ((HttpParser*)parser->data)->on_url(parser, at, length); |
Jan Jongboom |
15:ffc77f212382 | 137 | } |
Jan Jongboom |
15:ffc77f212382 | 138 | |
Jan Jongboom |
29:383e9bfbfbed | 139 | static int on_status_callback(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 140 | return ((HttpParser*)parser->data)->on_status(parser, at, length); |
Jan Jongboom |
15:ffc77f212382 | 141 | } |
Jan Jongboom |
15:ffc77f212382 | 142 | |
Jan Jongboom |
29:383e9bfbfbed | 143 | static int on_header_field_callback(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 144 | return ((HttpParser*)parser->data)->on_header_field(parser, at, length); |
Jan Jongboom |
15:ffc77f212382 | 145 | } |
Jan Jongboom |
15:ffc77f212382 | 146 | |
Jan Jongboom |
29:383e9bfbfbed | 147 | static int on_header_value_callback(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 148 | return ((HttpParser*)parser->data)->on_header_value(parser, at, length); |
Jan Jongboom |
15:ffc77f212382 | 149 | } |
Jan Jongboom |
15:ffc77f212382 | 150 | |
Jan Jongboom |
15:ffc77f212382 | 151 | static int on_headers_complete_callback(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 152 | return ((HttpParser*)parser->data)->on_headers_complete(parser); |
Jan Jongboom |
15:ffc77f212382 | 153 | } |
Jan Jongboom |
15:ffc77f212382 | 154 | |
Jan Jongboom |
29:383e9bfbfbed | 155 | static int on_body_callback(http_parser* parser, const char *at, uint32_t length) { |
Jan Jongboom |
15:ffc77f212382 | 156 | return ((HttpParser*)parser->data)->on_body(parser, at, length); |
Jan Jongboom |
15:ffc77f212382 | 157 | } |
Jan Jongboom |
15:ffc77f212382 | 158 | |
Jan Jongboom |
15:ffc77f212382 | 159 | static int on_message_complete_callback(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 160 | return ((HttpParser*)parser->data)->on_message_complete(parser); |
Jan Jongboom |
15:ffc77f212382 | 161 | } |
Jan Jongboom |
15:ffc77f212382 | 162 | |
Jan Jongboom |
15:ffc77f212382 | 163 | static int on_chunk_header_callback(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 164 | return ((HttpParser*)parser->data)->on_chunk_header(parser); |
Jan Jongboom |
15:ffc77f212382 | 165 | } |
Jan Jongboom |
15:ffc77f212382 | 166 | |
Jan Jongboom |
15:ffc77f212382 | 167 | static int on_chunk_complete_callback(http_parser* parser) { |
Jan Jongboom |
15:ffc77f212382 | 168 | return ((HttpParser*)parser->data)->on_chunk_complete(parser); |
Jan Jongboom |
15:ffc77f212382 | 169 | } |
Jan Jongboom |
15:ffc77f212382 | 170 | |
Jan Jongboom |
15:ffc77f212382 | 171 | HttpResponse* response; |
Jan Jongboom |
29:383e9bfbfbed | 172 | Callback<void(const char *at, uint32_t length)> body_callback; |
Jan Jongboom |
15:ffc77f212382 | 173 | http_parser* parser; |
Jan Jongboom |
15:ffc77f212382 | 174 | http_parser_settings* settings; |
Jan Jongboom |
15:ffc77f212382 | 175 | }; |
Jan Jongboom |
15:ffc77f212382 | 176 | |
Jan Jongboom |
15:ffc77f212382 | 177 | #endif // _HTTP_RESPONSE_PARSER_H_ |