if (parser->msg.pool != NULL)
pool_unref(&parser->msg.pool);
i_zero(&parser->msg);
- if (pool == NULL) {
- parser->msg.pool = pool_alloconly_create("http_message", 4096);
- } else {
+ if (pool != NULL) {
parser->msg.pool = pool;
pool_ref(pool);
}
parser->msg.date = (time_t)-1;
}
+pool_t http_message_parser_get_pool(struct http_message_parser *parser)
+{
+ if (parser->msg.pool == NULL)
+ parser->msg.pool = pool_alloconly_create("http_message", 4096);
+ return parser->msg.pool;
+}
+
int http_message_parse_version(struct http_message_parser *parser)
{
const unsigned char *p = parser->cur;
{
const struct http_header_field *hdr;
struct http_parser hparser;
+ pool_t pool;
+ pool = http_message_parser_get_pool(parser);
if (parser->msg.header == NULL)
- parser->msg.header = http_header_create(parser->msg.pool, 32);
+ parser->msg.header = http_header_create(pool, 32);
hdr = http_header_field_add(parser->msg.header, name, data, size);
/* RFC 7230, Section 3.2.2: Field Order
if (strcasecmp(option, "close") == 0)
parser->msg.connection_close = TRUE;
if (!array_is_created(&parser->msg.connection_options))
- p_array_init(&parser->msg.connection_options, parser->msg.pool, 4);
+ p_array_init(&parser->msg.connection_options, pool, 4);
opt_idx = array_append_space(&parser->msg.connection_options);
- *opt_idx = p_strdup(parser->msg.pool, option);
+ *opt_idx = p_strdup(pool, option);
}
if (hparser.cur < hparser.end || num_tokens == 0) {
/* Multiple Transfer-Encoding headers are allowed and combined into one */
if (!array_is_created(&parser->msg.transfer_encoding))
- p_array_init(&parser->msg.transfer_encoding, parser->msg.pool, 4);
+ p_array_init(&parser->msg.transfer_encoding, pool, 4);
/* RFC 7230, Section 3.3.1: Transfer-Encoding
bool parse_error;
coding = array_append_space(&parser->msg.transfer_encoding);
- coding->name = p_strdup(parser->msg.pool, trenc);
+ coding->name = p_strdup(pool, trenc);
/* *( OWS ";" OWS transfer-parameter ) */
parse_error = FALSE;
}
if (!array_is_created(&coding->parameters))
- p_array_init(&coding->parameters, parser->msg.pool, 2);
+ p_array_init(&coding->parameters, pool, 2);
param = array_append_space(&coding->parameters);
- param->attribute = p_strdup(parser->msg.pool, attribute);
- param->value = p_strdup(parser->msg.pool, value);
+ param->attribute = p_strdup(pool, attribute);
+ param->value = p_strdup(pool, value);
}
if (parse_error)
break;
while ((ret=http_header_parse_next_field(parser->header_parser,
&field_name, &field_data, &field_size, &error)) > 0) {
if (field_name == NULL) {
+ pool_t pool;
/* EOH */
/* Create empty header if there is none */
+ pool = http_message_parser_get_pool(parser);
if (parser->msg.header == NULL)
- parser->msg.header = http_header_create(parser->msg.pool, 1);
+ parser->msg.header = http_header_create(pool, 1);
/* handle HTTP/1.0 persistence */
if (msg->version_major == 1 && msg->version_minor == 0 &&
static int http_request_parse_method(struct http_request_parser *parser)
{
const unsigned char *p = parser->parser.cur;
+ pool_t pool;
/* method = token
*/
}
if (p == parser->parser.end)
return 0;
+ pool = http_message_parser_get_pool(&parser->parser);
parser->request_method =
- p_strdup_until(parser->parser.msg.pool, parser->parser.cur, p);
+ p_strdup_until(pool, parser->parser.cur, p);
parser->parser.cur = p;
return 1;
}
{
struct http_message_parser *_parser = &parser->parser;
const unsigned char *p = parser->parser.cur;
+ pool_t pool;
/* We'll just parse anything up to the first SP or a control char.
We could also implement workarounds for buggy HTTP clients and
}
if (p == _parser->end)
return 0;
- parser->request_target = p_strdup_until(_parser->msg.pool, _parser->cur, p);
+ pool = http_message_parser_get_pool(_parser);
+ parser->request_target = p_strdup_until(pool, _parser->cur, p);
parser->parser.cur = p;
return 1;
}
i_zero(request);
+ pool = http_message_parser_get_pool(&parser->parser);
if (http_url_request_target_parse(parser->request_target, hdr->value,
- parser->parser.msg.pool, &request->target, &error) < 0) {
+ pool, &request->target, &error) < 0) {
*error_code_r = HTTP_REQUEST_PARSE_ERROR_BAD_REQUEST;
*error_r = t_strdup_printf("Bad request target `%s': %s",
parser->request_target, error);