Mercurial > dovecot > original-hg > dovecot-2.2
changeset 16741:b172c130df9b
lib-http: Adjusted message parser to accept pool from caller.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Sun, 15 Sep 2013 03:36:44 +0300 |
parents | adb4d013073d |
children | 1404dbde402c |
files | src/lib-http/http-message-parser.c src/lib-http/http-message-parser.h src/lib-http/http-request-parser.c src/lib-http/http-request-parser.h src/lib-http/http-response-parser.c src/lib-http/test-http-server.c |
diffstat | 6 files changed, 34 insertions(+), 24 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-http/http-message-parser.c Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/http-message-parser.c Sun Sep 15 03:36:44 2013 +0300 @@ -22,13 +22,14 @@ { 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 @@ 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 @@ 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;
--- a/src/lib-http/http-message-parser.h Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/http-message-parser.h Sun Sep 15 03:36:44 2013 +0300 @@ -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 @@ 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);
--- a/src/lib-http/http-request-parser.c Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/http-request-parser.c Sun Sep 15 03:36:44 2013 +0300 @@ -47,9 +47,10 @@ } 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 @@ 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 @@ 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 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 @@ 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_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 @@ _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 @@ } 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 @@ [ 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)
--- a/src/lib-http/http-request-parser.h Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/http-request-parser.h Sun Sep 15 03:36:44 2013 +0300 @@ -23,7 +23,7 @@ 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
--- a/src/lib-http/http-response-parser.c Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/http-response-parser.c Sun Sep 15 03:36:44 2013 +0300 @@ -48,7 +48,7 @@ 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 @@ 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; }
--- a/src/lib-http/test-http-server.c Sun Sep 15 03:36:18 2013 +0300 +++ b/src/lib-http/test-http-server.c Sun Sep 15 03:36:44 2013 +0300 @@ -53,7 +53,7 @@ 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);