From: Stephan Bosch Date: Sun, 15 Sep 2013 00:36:44 +0000 (+0300) Subject: lib-http: Adjusted message parser to accept pool from caller. X-Git-Tag: 2.2.6~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6dad0888fcec8372f230941c70d8940b8c203b32;p=thirdparty%2Fdovecot%2Fcore.git lib-http: Adjusted message parser to accept pool from caller. --- diff --git a/src/lib-http/http-message-parser.c b/src/lib-http/http-message-parser.c index a7fd637ee8..5669969b9a 100644 --- a/src/lib-http/http-message-parser.c +++ b/src/lib-http/http-message-parser.c @@ -22,13 +22,14 @@ void http_message_parser_deinit(struct http_message_parser *parser) { if (parser->header_parser != NULL) http_header_parser_deinit(&parser->header_parser); - if (parser->msg_pool != NULL) - pool_unref(&parser->msg_pool); + if (parser->msg.pool != NULL) + pool_unref(&parser->msg.pool); if (parser->payload != NULL) i_stream_unref(&parser->payload); } -void http_message_parser_restart(struct http_message_parser *parser) +void http_message_parser_restart(struct http_message_parser *parser, + pool_t pool) { i_assert(parser->payload == NULL); @@ -37,12 +38,17 @@ void http_message_parser_restart(struct http_message_parser *parser) else http_header_parser_reset(parser->header_parser); - if (parser->msg_pool != NULL) - pool_unref(&parser->msg_pool); - parser->msg_pool = pool_alloconly_create("http_message", 4096); + if (parser->msg.pool != NULL) + pool_unref(&parser->msg.pool); memset(&parser->msg, 0, sizeof(parser->msg)); + if (pool == NULL) { + parser->msg.pool = pool_alloconly_create("http_message", 4096); + } else { + parser->msg.pool = pool; + pool_ref(pool); + } parser->msg.date = (time_t)-1; - p_array_init(&parser->msg.headers, parser->msg_pool, 32); + p_array_init(&parser->msg.headers, parser->msg.pool, 32); } int http_message_parse_version(struct http_message_parser *parser) @@ -95,8 +101,8 @@ http_message_parse_header(struct http_message_parser *parser, const char *name, void *value; hdr = array_append_space(&parser->msg.headers); - hdr->key = p_strdup(parser->msg_pool, name); - hdr->value = value = p_malloc(parser->msg_pool, size+1); + hdr->key = p_strdup(parser->msg.pool, name); + hdr->value = value = p_malloc(parser->msg.pool, size+1); memcpy(value, data, size); hdr->size = size; diff --git a/src/lib-http/http-message-parser.h b/src/lib-http/http-message-parser.h index d5bcf91103..026991de92 100644 --- a/src/lib-http/http-message-parser.h +++ b/src/lib-http/http-message-parser.h @@ -4,6 +4,8 @@ #include "http-response.h" struct http_message { + pool_t pool; + unsigned int version_major; unsigned int version_minor; @@ -32,7 +34,8 @@ struct http_message_parser { void http_message_parser_init(struct http_message_parser *parser, struct istream *input); void http_message_parser_deinit(struct http_message_parser *parser); -void http_message_parser_restart(struct http_message_parser *parser); +void http_message_parser_restart(struct http_message_parser *parser, + pool_t pool); int http_message_parse_finish_payload(struct http_message_parser *parser, const char **error_r); diff --git a/src/lib-http/http-request-parser.c b/src/lib-http/http-request-parser.c index 0664ee44a4..9aa3e816bd 100644 --- a/src/lib-http/http-request-parser.c +++ b/src/lib-http/http-request-parser.c @@ -47,9 +47,10 @@ void http_request_parser_deinit(struct http_request_parser **_parser) } static void -http_request_parser_restart(struct http_request_parser *parser) +http_request_parser_restart(struct http_request_parser *parser, + pool_t pool) { - http_message_parser_restart(&parser->parser); + http_message_parser_restart(&parser->parser, pool); parser->request_method = NULL; parser->request_target = NULL; } @@ -66,7 +67,7 @@ static int http_request_parse_method(struct http_request_parser *parser) if (p == parser->parser.end) return 0; parser->request_method = - p_strdup_until(parser->parser.msg_pool, parser->parser.cur, p); + p_strdup_until(parser->parser.msg.pool, parser->parser.cur, p); parser->parser.cur = p; return 1; } @@ -85,7 +86,7 @@ static int http_request_parse_target(struct http_request_parser *parser) if (p == parser->parser.end) return 0; parser->request_target = - p_strdup_until(parser->parser.msg_pool, parser->parser.cur, p); + p_strdup_until(parser->parser.msg.pool, parser->parser.cur, p); parser->parser.cur = p; return 1; } @@ -98,7 +99,7 @@ static inline const char *_chr_sanitize(unsigned char c) } static int http_request_parse(struct http_request_parser *parser, - const char **error_r) + pool_t pool, const char **error_r) { struct http_message_parser *_parser = &parser->parser; int ret; @@ -109,7 +110,7 @@ static int http_request_parse(struct http_request_parser *parser, for (;;) { switch (parser->state) { case HTTP_REQUEST_PARSE_STATE_INIT: - http_request_parser_restart(parser); + http_request_parser_restart(parser, pool); parser->state = HTTP_REQUEST_PARSE_STATE_SKIP_LINE; if (_parser->cur == _parser->end) return 0; @@ -215,7 +216,7 @@ static int http_request_parse(struct http_request_parser *parser, } static int http_request_parse_request_line(struct http_request_parser *parser, - const char **error_r) + pool_t pool, const char **error_r) { struct http_message_parser *_parser = &parser->parser; const unsigned char *begin; @@ -227,7 +228,7 @@ static int http_request_parse_request_line(struct http_request_parser *parser, _parser->cur = begin; _parser->end = _parser->cur + size; - if ((ret = http_request_parse(parser, error_r)) < 0) + if ((ret = http_request_parse(parser, pool, error_r)) < 0) return -1; i_stream_skip(_parser->input, _parser->cur - begin); @@ -248,7 +249,7 @@ static int http_request_parse_request_line(struct http_request_parser *parser, } int http_request_parse_next(struct http_request_parser *parser, - struct http_request *request, + pool_t pool, struct http_request *request, const char **error_r) { int ret; @@ -264,7 +265,7 @@ int http_request_parse_next(struct http_request_parser *parser, [ message-body ] */ if (parser->state != HTTP_REQUEST_PARSE_STATE_HEADER) { - if ((ret = http_request_parse_request_line(parser, error_r)) <= 0) + if ((ret = http_request_parse_request_line(parser, pool, error_r)) <= 0) return ret; } if ((ret = http_message_parse_headers(&parser->parser, error_r)) <= 0) diff --git a/src/lib-http/http-request-parser.h b/src/lib-http/http-request-parser.h index f14f341bec..f285101a6a 100644 --- a/src/lib-http/http-request-parser.h +++ b/src/lib-http/http-request-parser.h @@ -23,7 +23,7 @@ http_request_parser_init(struct istream *input); void http_request_parser_deinit(struct http_request_parser **_parser); int http_request_parse_next(struct http_request_parser *parser, - struct http_request *request, + pool_t pool, struct http_request *request, const char **error_r); #endif diff --git a/src/lib-http/http-response-parser.c b/src/lib-http/http-response-parser.c index f902902a21..4384789573 100644 --- a/src/lib-http/http-response-parser.c +++ b/src/lib-http/http-response-parser.c @@ -48,7 +48,7 @@ void http_response_parser_deinit(struct http_response_parser **_parser) static void http_response_parser_restart(struct http_response_parser *parser) { - http_message_parser_restart(&parser->parser); + http_message_parser_restart(&parser->parser, NULL); parser->response_status = 0; parser->response_reason = NULL; } @@ -83,7 +83,7 @@ static int http_response_parse_reason(struct http_response_parser *parser) if (p == parser->parser.end) return 0; parser->response_reason = - p_strdup_until(parser->parser.msg_pool, parser->parser.cur, p); + p_strdup_until(parser->parser.msg.pool, parser->parser.cur, p); parser->parser.cur = p; return 1; } diff --git a/src/lib-http/test-http-server.c b/src/lib-http/test-http-server.c index e692966422..d0f30231ee 100644 --- a/src/lib-http/test-http-server.c +++ b/src/lib-http/test-http-server.c @@ -53,7 +53,7 @@ static void client_input(struct connection *conn) int ret; while ((ret = http_request_parse_next - (client->parser, &request, &error)) > 0) { + (client->parser, NULL, &request, &error)) > 0) { if (client_handle_request(client, &request) < 0 || request.connection_close) { client_destroy(conn);