HTTP and HTTPS library for Mbed OS 5

Dependents:   RZ_A2M_Mbed_samples_20201012 RZ_A2M_Mbed_samples

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?

UserRevisionLine numberNew 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_