unsigned int part_seen_content_type:1;
unsigned int multipart:1;
+ unsigned int preparsed:1;
unsigned int eof:1;
};
i_assert(parts != NULL);
ctx = message_parser_init_int(input, hdr_flags, flags);
+ ctx->preparsed = TRUE;
ctx->parts = ctx->part = parts;
ctx->parse_next_block = preparsed_parse_next_header_init;
return ctx;
}
-int message_parser_deinit(struct message_parser_ctx **_ctx,
+void message_parser_deinit(struct message_parser_ctx **_ctx,
struct message_part **parts_r)
{
const char *error;
- return message_parser_deinit_from_parts(_ctx, parts_r, &error);
+ i_assert((**_ctx).preparsed == FALSE);
+ if (message_parser_deinit_from_parts(_ctx, parts_r, &error) < 0)
+ i_panic("message_parser_deinit_from_parts: %s", error);
}
int message_parser_deinit_from_parts(struct message_parser_ctx **_ctx,
message_parser_init(pool_t part_pool, struct istream *input,
enum message_header_parser_flags hdr_flags,
enum message_parser_flags flags);
+/* Deinitialize message parser. The ctx must NOT have been created by
+ message_parser_init_from_parts(). */
+void message_parser_deinit(struct message_parser_ctx **ctx,
+ struct message_part **parts_r);
/* Use preparsed parts to speed up parsing. */
struct message_parser_ctx *
message_parser_init_from_parts(struct message_part *parts,
struct istream *input,
enum message_header_parser_flags hdr_flags,
enum message_parser_flags flags);
-/* Returns 0 if parts were returned, -1 we used preparsed parts and they
- didn't match the current message */
-int message_parser_deinit(struct message_parser_ctx **ctx,
- struct message_part **parts_r);
/* Same as message_parser_deinit(), but return an error message describing
why the preparsed parts didn't match the message. This can also safely be
called even when preparsed parts weren't used - it'll always just return
unsigned int i, end_of_headers_idx;
string_t *output;
pool_t pool;
+ const char *error;
int ret;
test_begin("message parser in small blocks");
}
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(strcmp(test_msg, str_c(output)) == 0);
/* parsing in small blocks */
test_assert((ret == 0 && i <= TEST_MSG_LEN*2) ||
(ret < 0 && i > TEST_MSG_LEN*2));
}
- test_assert(message_parser_deinit(&parser, &parts2) == 0);
+ message_parser_deinit(&parser, &parts2);
test_assert(msg_parts_cmp(parts, parts2));
/* parsing in small blocks from preparsed parts */
test_assert((ret == 0 && i/2 <= end_of_headers_idx) ||
(ret < 0 && i/2 > end_of_headers_idx));
}
- test_assert(message_parser_deinit(&parser, &parts2) == 0);
+ test_assert(message_parser_deinit_from_parts(&parser, &parts2, &error) == 0);
test_assert(msg_parts_cmp(parts, parts2));
i_stream_unref(&input);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert((parts->flags & MESSAGE_PART_FLAG_MULTIPART) != 0);
test_assert(parts->body_size.lines == 8);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 2);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 1);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 2);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 2);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 2);
parser = message_parser_init(pool, input, 0, 0);
while ((ret = message_parser_parse_next_block(parser, &block)) > 0) ;
test_assert(ret < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
test_assert(parts->flags == (MESSAGE_PART_FLAG_MULTIPART | MESSAGE_PART_FLAG_IS_MIME));
test_assert(parts->header_size.lines == 2);
test_assert(message_parser_parse_next_block(parser, &block) > 0 &&
block.hdr == NULL && block.size == 0);
test_assert(message_parser_parse_next_block(parser, &block) < 0);
- test_assert(message_parser_deinit(&parser, &parts) == 0);
+ message_parser_deinit(&parser, &parts);
i_stream_unref(&input);
pool_unref(&pool);