Library for Firebase, PUT, PATCH, POST, GET, DELETE operations supported, (others are available, todo). Based on Mbed's https-example. Tested on STM32F767 using ETHERNET and ESP8266 WIFI interfaces and STM32F446 using ESP8266 WIFI interface.

Dependents:   Firebase-Example

Committer:
star297
Date:
Sun May 10 08:08:23 2020 +0000
Revision:
3:4d7c08734a91
Parent:
0:768ae9838086
added PATCH function

Who changed what in which revision?

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