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