]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: Adjusted message parser to accept pool from caller.
authorStephan Bosch <stephan@rename-it.nl>
Sun, 15 Sep 2013 00:36:44 +0000 (03:36 +0300)
committerStephan Bosch <stephan@rename-it.nl>
Sun, 15 Sep 2013 00:36:44 +0000 (03:36 +0300)
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

index a7fd637ee8e4657a76ffbcbea75af454bb73aab7..5669969b9a742ab38448e630f91b1f783f912b80 100644 (file)
@@ -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;
 
index d5bcf911035640f72b204fb40688312513664b9d..026991de926d87126d3ad65d9212b6a2477415ca 100644 (file)
@@ -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);
index 0664ee44a438bd221197ab224ae084992604f292..9aa3e816bda6d65f9f81af9e9c5bd6ad127dfb47 100644 (file)
@@ -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)
index f14f341bec7dff76cd8f4214be02d080fc8d6f15..f285101a6a75bb3dc37d574f8c7e62ae83be9d4c 100644 (file)
@@ -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
index f902902a21fbcc0696441fb1efc7828358830dc6..43847895739a0f39cf485a47fe57f187e83aa816 100644 (file)
@@ -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;
 }
index e692966422ce40192ead13ffc710ef98b5a9c673..d0f30231ee784be02a7772dff9d779d513650624 100644 (file)
@@ -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);