fix superfluous \r\n after body
Fork of mbed-http by
source/http_response_parser.h@3:8a6b003e3874, 2017-02-23 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Thu Feb 23 13:28:07 2017 +0100
- Revision:
- 3:8a6b003e3874
- Parent:
- 0:910f5949759f
- Child:
- 4:539df159e058
Rely on Content-Length header to determine when request is processed
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 |
0:910f5949759f | 106 | string s(at, length); |
Jan Jongboom |
0:910f5949759f | 107 | response->set_body(s); |
Jan Jongboom |
0:910f5949759f | 108 | return 0; |
Jan Jongboom |
0:910f5949759f | 109 | } |
Jan Jongboom |
0:910f5949759f | 110 | |
Jan Jongboom |
0:910f5949759f | 111 | int on_message_complete(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 112 | return 0; |
Jan Jongboom |
0:910f5949759f | 113 | } |
Jan Jongboom |
0:910f5949759f | 114 | |
Jan Jongboom |
0:910f5949759f | 115 | int on_chunk_header(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 116 | // ?? Don't know when this is used |
Jan Jongboom |
0:910f5949759f | 117 | return 0; |
Jan Jongboom |
0:910f5949759f | 118 | } |
Jan Jongboom |
0:910f5949759f | 119 | |
Jan Jongboom |
0:910f5949759f | 120 | int on_chunk_complete(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 121 | // ?? Don't know when this is used |
Jan Jongboom |
0:910f5949759f | 122 | return 0; |
Jan Jongboom |
0:910f5949759f | 123 | } |
Jan Jongboom |
0:910f5949759f | 124 | |
Jan Jongboom |
0:910f5949759f | 125 | // Static http_parser callback functions |
Jan Jongboom |
0:910f5949759f | 126 | static int on_message_begin_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 127 | return ((HttpResponseParser*)parser->data)->on_message_begin(parser); |
Jan Jongboom |
0:910f5949759f | 128 | } |
Jan Jongboom |
0:910f5949759f | 129 | |
Jan Jongboom |
0:910f5949759f | 130 | static int on_url_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 131 | return ((HttpResponseParser*)parser->data)->on_url(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 132 | } |
Jan Jongboom |
0:910f5949759f | 133 | |
Jan Jongboom |
0:910f5949759f | 134 | static int on_status_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 135 | return ((HttpResponseParser*)parser->data)->on_status(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 136 | } |
Jan Jongboom |
0:910f5949759f | 137 | |
Jan Jongboom |
0:910f5949759f | 138 | static int on_header_field_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 139 | return ((HttpResponseParser*)parser->data)->on_header_field(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 140 | } |
Jan Jongboom |
0:910f5949759f | 141 | |
Jan Jongboom |
0:910f5949759f | 142 | static int on_header_value_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 143 | return ((HttpResponseParser*)parser->data)->on_header_value(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 144 | } |
Jan Jongboom |
0:910f5949759f | 145 | |
Jan Jongboom |
0:910f5949759f | 146 | static int on_headers_complete_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 147 | return ((HttpResponseParser*)parser->data)->on_headers_complete(parser); |
Jan Jongboom |
0:910f5949759f | 148 | } |
Jan Jongboom |
0:910f5949759f | 149 | |
Jan Jongboom |
0:910f5949759f | 150 | static int on_body_callback(http_parser* parser, const char *at, size_t length) { |
Jan Jongboom |
0:910f5949759f | 151 | return ((HttpResponseParser*)parser->data)->on_body(parser, at, length); |
Jan Jongboom |
0:910f5949759f | 152 | } |
Jan Jongboom |
0:910f5949759f | 153 | |
Jan Jongboom |
0:910f5949759f | 154 | static int on_message_complete_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 155 | return ((HttpResponseParser*)parser->data)->on_message_complete(parser); |
Jan Jongboom |
0:910f5949759f | 156 | } |
Jan Jongboom |
0:910f5949759f | 157 | |
Jan Jongboom |
0:910f5949759f | 158 | static int on_chunk_header_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 159 | return ((HttpResponseParser*)parser->data)->on_chunk_header(parser); |
Jan Jongboom |
0:910f5949759f | 160 | } |
Jan Jongboom |
0:910f5949759f | 161 | |
Jan Jongboom |
0:910f5949759f | 162 | static int on_chunk_complete_callback(http_parser* parser) { |
Jan Jongboom |
0:910f5949759f | 163 | return ((HttpResponseParser*)parser->data)->on_chunk_complete_callback(parser); |
Jan Jongboom |
0:910f5949759f | 164 | } |
Jan Jongboom |
0:910f5949759f | 165 | |
Jan Jongboom |
0:910f5949759f | 166 | HttpResponse* response; |
Jan Jongboom |
0:910f5949759f | 167 | Callback<void(const char *at, size_t length)> body_callback; |
Jan Jongboom |
0:910f5949759f | 168 | http_parser* parser; |
Jan Jongboom |
0:910f5949759f | 169 | http_parser_settings* settings; |
Jan Jongboom |
0:910f5949759f | 170 | }; |
Jan Jongboom |
0:910f5949759f | 171 | |
Jan Jongboom |
0:910f5949759f | 172 | #endif // _HTTP_RESPONSE_PARSER_H_ |