#include "buffer.h"
#include "istream.h"
#include "str.h"
+#include "strfuncs.h"
#include "unichar.h"
#include "message-size.h"
#include "message-header-parser.h"
line->value = msg;
line->value_len = size;
} else if (colon_pos == UINT_MAX) {
- /* missing ':', assume the whole line is name */
- line->value = NULL;
- line->value_len = 0;
+ /* missing ':', assume the whole line is value */
+ line->value = msg;
+ line->value_len = size;
+ line->full_value_offset = line->name_offset;
- str_truncate(ctx->name, 0);
- buffer_append(ctx->name, msg, size);
- line->name = str_c(ctx->name);
- line->name_len = str_len(ctx->name);
+ line->name = "";
+ line->name_len = 0;
- line->middle = NULL;
+ line->middle = uchar_empty_ptr;
line->middle_len = 0;
} else {
size_t pos;
test_assert(message_parse_header_next(parser, &hdr) > 0 &&
strcmp(hdr->name, "a") == 0);
test_assert(message_parse_header_next(parser, &hdr) > 0 &&
- strcmp(hdr->name, "\r") == 0 && hdr->middle_len == 0 &&
- hdr->value_len == 0 && !hdr->eoh);
+ *hdr->value == '\r' && hdr->value_len == 1 &&
+ hdr->full_value_offset == 4 &&
+ hdr->middle_len == 0 &&
+ hdr->name_len == 0 && !hdr->eoh);
test_assert(message_parse_header_next(parser, &hdr) < 0);
message_parse_header_deinit(&parser);
test_assert(input->stream_errno == 0);
if (ctx->stop)
*matched = TRUE;
} else {
- if (strspn(hdr->name, "\r") == hdr->name_len) {
+ if (hdr->value_len > 0 && hdr->middle_len == 0 && hdr->name_len == 0 &&
+ i_memspn(hdr->value, hdr->value_len, "\r", 1U) == hdr->value_len) {
/* CR+CR+LF - some servers stop the header processing
here while others don't. To make sure they can be
matched correctly we want to stop here entirely. */