dovecot-2.2: lib-http: Adjusted message parser to accept pool fr...

dovecot at dovecot.org dovecot at dovecot.org
Sun Sep 15 03:38:25 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/b172c130df9b
changeset: 16741:b172c130df9b
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sun Sep 15 03:36:44 2013 +0300
description:
lib-http: Adjusted message parser to accept pool from caller.

diffstat:

 src/lib-http/http-message-parser.c  |  24 +++++++++++++++---------
 src/lib-http/http-message-parser.h  |   5 ++++-
 src/lib-http/http-request-parser.c  |  21 +++++++++++----------
 src/lib-http/http-request-parser.h  |   2 +-
 src/lib-http/http-response-parser.c |   4 ++--
 src/lib-http/test-http-server.c     |   2 +-
 6 files changed, 34 insertions(+), 24 deletions(-)

diffs (209 lines):

diff -r adb4d013073d -r b172c130df9b src/lib-http/http-message-parser.c
--- 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;
 
diff -r adb4d013073d -r b172c130df9b src/lib-http/http-message-parser.h
--- 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);
diff -r adb4d013073d -r b172c130df9b src/lib-http/http-request-parser.c
--- 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)
diff -r adb4d013073d -r b172c130df9b src/lib-http/http-request-parser.h
--- 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
diff -r adb4d013073d -r b172c130df9b src/lib-http/http-response-parser.c
--- 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;
 }
diff -r adb4d013073d -r b172c130df9b src/lib-http/test-http-server.c
--- 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);


More information about the dovecot-cvs mailing list