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_parser.h@7:2e3eedb9ca5c, 2017-02-24 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Fri Feb 24 11:20:16 2017 +0100
- Revision:
- 7:2e3eedb9ca5c
- Parent:
- 4:539df159e058
Add support for chunked encoding. Fix bug handle querystrings. HttpResponse should own header strings.
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 _HTTP_RESPONSE_PARSER_H_ |
Jan Jongboom |
0:910f5949759f | 19 | #define _HTTP_RESPONSE_PARSER_H_ |
Jan Jongboom |
0:910f5949759f | 20 | |
Jan Jongboom |
0:910f5949759f | 21 | #include "http_parser.h" |
Jan Jongboom |
0:910f5949759f | 22 | #include "http_response.h" |
Jan Jongboom |
0:910f5949759f | 23 | |
Jan Jongboom |
0:910f5949759f | 24 | class HttpResponseParser { |
Jan Jongboom |
0:910f5949759f | 25 | public: |
Jan Jongboom |
0:910f5949759f | 26 | HttpResponseParser(HttpResponse* a_response, Callback<void(const char *at, size_t length)> a_body_callback = 0) |
Jan Jongboom |
0:910f5949759f | 27 | : response(a_response), body_callback(a_body_callback) |
Jan Jongboom |
0:910f5949759f | 28 | { |
Jan Jongboom |
0:910f5949759f | 29 | settings = new http_parser_settings(); |
Jan Jongboom |
0:910f5949759f | 30 | |
Jan Jongboom |
0:910f5949759f | 31 | settings->on_message_begin = &HttpResponseParser::on_message_begin_callback; |
Jan Jongboom |
0:910f5949759f | 32 | settings->on_url = &HttpResponseParser::on_url_callback; |
Jan Jongboom |
0:910f5949759f | 33 | settings->on_status = &HttpResponseParser::on_status_callback; |
Jan Jongboom |
0:910f5949759f | 34 | settings->on_header_field = &HttpResponseParser::on_header_field_callback; |
Jan Jongboom |
0:910f5949759f | 35 | settings->on_header_value = &HttpResponseParser::on_header_value_callback; |
Jan Jongboom |
0:910f5949759f | 36 | settings->on_headers_complete = &HttpResponseParser::on_headers_complete_callback; |
Jan Jongboom |
0:910f5949759f | 37 | settings->on_chunk_header = &HttpResponseParser::on_chunk_header_callback; |
Jan Jongboom |
0:910f5949759f | 38 | settings->on_chunk_complete = &HttpResponseParser::on_chunk_complete_callback; |
Jan Jongboom |
0:910f5949759f | 39 | settings->on_body = &HttpResponseParser::on_body_callback; |
Jan Jongboom |
0:910f5949759f | 40 | settings->on_message_complete = &HttpResponseParser::on_message_complete_callback; |
Jan Jongboom |
0:910f5949759f | 41 | |
Jan Jongboom |
0:910f5949759f | 42 | // Construct the http_parser object |
Jan Jongboom |
0:910f5949759f | 43 | parser = new http_parser(); |
Jan Jongboom |
0:910f5949759f | 44 | http_parser_init(parser, HTTP_RESPONSE); |
Jan Jongboom |
0:910f5949759f | 45 | parser->data = (void*)this; |
Jan Jongboom |
0:910f5949759f | 46 | } |
Jan Jongboom |
0:910f5949759f | 47 | |
Jan Jongboom |
0:910f5949759f | 48 | ~HttpResponseParser() { |
Jan Jongboom |
0:910f5949759f | 49 | if (parser) { |
Jan Jongboom |
0:910f5949759f | 50 | delete parser; |
Jan Jongboom |
0:910f5949759f | 51 | } |
Jan Jongboom |
0:910f5949759f | 52 | if (settings) { |
Jan Jongboom |
0:910f5949759f | 53 | delete settings; |
Jan Jongboom |
0:910f5949759f | 54 | } |
Jan Jongboom |
0:910f5949759f | 55 | } |
Jan Jongboom |
0:910f5949759f | 56 | |
Jan Jongboom |
0:910f5949759f | 57 | size_t execute(const char* buffer, size_t buffer_size) { |
Jan Jongboom |
0:910f5949759f | 58 | return http_parser_execute(parser, settings, buffer, buffer_size); |
Jan Jongboom |
0:910f5949759f | 59 | } |
Jan Jongboom |
0:910f5949759f | 60 | |
Jan Jongboom |
0:910f5949759f | 61 | void finish() { |
Jan Jongboom |
0:910f5949759f | 62 | http_parser_execute(parser, settings, NULL, 0); |
Jan Jongboom |
0:910f5949759f | 63 | } |
Jan Jongboom |
0:910f5949759f | 64 | |
Jan Jongboom |
0:910f5949759f | 65 | private: |
Jan Jongboom |
0:910f5949759f | 66 | // Member functions |
Jan Jongboom |
0:910f5949759f | 67 | int on_message_begin(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 68 | return 0; |
Jan Jongboom |
0:910f5949759f | 69 | } |
Jan Jongboom |
0:910f5949759f | 70 | |
Jan Jongboom |
0:910f5949759f | 71 | int on_url(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 72 | return 0; |
Jan Jongboom |
0:910f5949759f | 73 | } |
Jan Jongboom |
0:910f5949759f | 74 | |
Jan Jongboom |
0:910f5949759f | 75 | int on_status(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 76 | string s(at, length); |
Jan Jongboom |
0:910f5949759f | 77 | response->set_status(parser->status_code, s); |
Jan Jongboom |
0:910f5949759f | 78 | return 0; |
Jan Jongboom |
0:910f5949759f | 79 | } |
Jan Jongboom |
0:910f5949759f | 80 | |
Jan Jongboom |
0:910f5949759f | 81 | int on_header_field(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 82 | string s(at, length); |
Jan Jongboom |
0:910f5949759f | 83 | response->set_header_field(s); |
Jan Jongboom |
0:910f5949759f | 84 | return 0; |
Jan Jongboom |
0:910f5949759f | 85 | } |
Jan Jongboom |
0:910f5949759f | 86 | |
Jan Jongboom |
0:910f5949759f | 87 | int on_header_value(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 88 | string s(at, length); |
Jan Jongboom |
0:910f5949759f | 89 | response->set_header_value(s); |
Jan Jongboom |
0:910f5949759f | 90 | return 0; |
Jan Jongboom |
0:910f5949759f | 91 | } |
Jan Jongboom |
0:910f5949759f | 92 | |
Jan Jongboom |
3:8a6b003e3874 | 93 | int on_headers_complete(http_parser* parser) { |
Jan Jongboom |
3:8a6b003e3874 | 94 | response->set_headers_complete(); |
Jan Jongboom |
0:910f5949759f | 95 | return 0; |
Jan Jongboom |
0:910f5949759f | 96 | } |
Jan Jongboom |
0:910f5949759f | 97 | |
Jan Jongboom |
0:910f5949759f | 98 | int on_body(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
3:8a6b003e3874 | 99 | response->increase_body_length(length); |
Jan Jongboom |
3:8a6b003e3874 | 100 | |
Jan Jongboom |
0:910f5949759f | 101 | if (body_callback) { |
Jan Jongboom |
0:910f5949759f | 102 | body_callback(at, length); |
Jan Jongboom |
0:910f5949759f | 103 | return 0; |
Jan Jongboom |
0:910f5949759f | 104 | } |
Jan Jongboom |
0:910f5949759f | 105 | |
Jan Jongboom |
4:539df159e058 | 106 | response->set_body(at, length); |
Jan Jongboom |
0:910f5949759f | 107 | return 0; |
Jan Jongboom |
0:910f5949759f | 108 | } |
Jan Jongboom |
0:910f5949759f | 109 | |
Jan Jongboom |
0:910f5949759f | 110 | int on_message_complete(http_parser* parser) { |
Jan Jongboom |
7:2e3eedb9ca5c | 111 | response->set_message_complete(); |
Jan Jongboom |
7:2e3eedb9ca5c | 112 | |
Jan Jongboom |
0:910f5949759f | 113 | return 0; |
Jan Jongboom |
0:910f5949759f | 114 | } |
Jan Jongboom |
0:910f5949759f | 115 | |
Jan Jongboom |
0:910f5949759f | 116 | int on_chunk_header(http_parser* parser) { |
Jan Jongboom |
7:2e3eedb9ca5c | 117 | response->set_chunked(); |
Jan Jongboom |
7:2e3eedb9ca5c | 118 | |
Jan Jongboom |
0:910f5949759f | 119 | return 0; |
Jan Jongboom |
0:910f5949759f | 120 | } |
Jan Jongboom |
0:910f5949759f | 121 | |
Jan Jongboom |
0:910f5949759f | 122 | int on_chunk_complete(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 123 | return 0; |
Jan Jongboom |
0:910f5949759f | 124 | } |
Jan Jongboom |
0:910f5949759f | 125 | |
Jan Jongboom |
0:910f5949759f | 126 | // Static http_parser callback functions |
Jan Jongboom |
0:910f5949759f | 127 | static int on_message_begin_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 128 | return ((HttpResponseParser*)parser->data)->on_message_begin(parser); |
Jan Jongboom |
0:910f5949759f | 129 | } |
Jan Jongboom |
0:910f5949759f | 130 | |
Jan Jongboom |
0:910f5949759f | 131 | static int on_url_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 132 | return ((HttpResponseParser*)parser->data)->on_url(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 133 | } |
Jan Jongboom |
0:910f5949759f | 134 | |
Jan Jongboom |
0:910f5949759f | 135 | static int on_status_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 136 | return ((HttpResponseParser*)parser->data)->on_status(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 137 | } |
Jan Jongboom |
0:910f5949759f | 138 | |
Jan Jongboom |
0:910f5949759f | 139 | static int on_header_field_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 140 | return ((HttpResponseParser*)parser->data)->on_header_field(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 141 | } |
Jan Jongboom |
0:910f5949759f | 142 | |
Jan Jongboom |
0:910f5949759f | 143 | static int on_header_value_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 144 | return ((HttpResponseParser*)parser->data)->on_header_value(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 145 | } |
Jan Jongboom |
0:910f5949759f | 146 | |
Jan Jongboom |
0:910f5949759f | 147 | static int on_headers_complete_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 148 | return ((HttpResponseParser*)parser->data)->on_headers_complete(parser); |
Jan Jongboom |
0:910f5949759f | 149 | } |
Jan Jongboom |
0:910f5949759f | 150 | |
Jan Jongboom |
0:910f5949759f | 151 | static int on_body_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 152 | return ((HttpResponseParser*)parser->data)->on_body(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 153 | } |
Jan Jongboom |
0:910f5949759f | 154 | |
Jan Jongboom |
0:910f5949759f | 155 | static int on_message_complete_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 156 | return ((HttpResponseParser*)parser->data)->on_message_complete(parser); |
Jan Jongboom |
0:910f5949759f | 157 | } |
Jan Jongboom |
0:910f5949759f | 158 | |
Jan Jongboom |
0:910f5949759f | 159 | static int on_chunk_header_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 160 | return ((HttpResponseParser*)parser->data)->on_chunk_header(parser); |
Jan Jongboom |
0:910f5949759f | 161 | } |
Jan Jongboom |
0:910f5949759f | 162 | |
Jan Jongboom |
0:910f5949759f | 163 | static int on_chunk_complete_callback(http_parser* parser) { |
Jan Jongboom |
7:2e3eedb9ca5c | 164 | return ((HttpResponseParser*)parser->data)->on_chunk_complete(parser); |
Jan Jongboom |
0:910f5949759f | 165 | } |
Jan Jongboom |
0:910f5949759f | 166 | |
Jan Jongboom |
0:910f5949759f | 167 | HttpResponse* response; |
Jan Jongboom |
0:910f5949759f | 168 | Callback<void(const char *at, size_t length)> body_callback; |
Jan Jongboom |
0:910f5949759f | 169 | http_parser* parser; |
Jan Jongboom |
0:910f5949759f | 170 | http_parser_settings* settings; |
Jan Jongboom |
0:910f5949759f | 171 | }; |
Jan Jongboom |
0:910f5949759f | 172 | |
Jan Jongboom |
0:910f5949759f | 173 | #endif // _HTTP_RESPONSE_PARSER_H_ |