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.
source/http_request_parser.h@3:4d7c08734a91, 2020-05-10 (annotated)
- 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?
User | Revision | Line number | New 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_ |