Fork of mbed-http

Fork of mbed-http by sandbox

Committer:
Matthew Else
Date:
Wed Mar 29 17:26:14 2017 +0100
Revision:
14:5f9acddaa0a4
Parent:
7:2e3eedb9ca5c
Tidy up chunked detection

Who changed what in which revision?

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