From: Timo Sirainen Date: Mon, 2 Jun 2008 18:19:26 +0000 (+0300) Subject: header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add X-Git-Tag: 1.1.rc8~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aeed83649fbeef2cba51fd909635c4463ee642e7;p=thirdparty%2Fdovecot%2Fcore.git header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add end-of-headers line if it's missing. --HG-- branch : HEAD --- diff --git a/src/lib-mail/istream-header-filter.c b/src/lib-mail/istream-header-filter.c index 175ba546ba..20563a8481 100644 --- a/src/lib-mail/istream-header-filter.c +++ b/src/lib-mail/istream-header-filter.c @@ -28,10 +28,12 @@ struct header_filter_istream { ARRAY_DEFINE(match_change_lines, unsigned int); unsigned int header_read:1; + unsigned int seen_eoh:1; unsigned int header_parsed:1; unsigned int exclude:1; unsigned int crlf:1; unsigned int hide_body:1; + unsigned int add_missing_eoh:1; }; header_filter_callback *null_header_filter_callback = NULL; @@ -115,6 +117,14 @@ static bool match_line_changed(struct header_filter_istream *mstream) cmp_uint) != NULL; } +static void add_eol(struct header_filter_istream *mstream) +{ + if (mstream->crlf) + buffer_append(mstream->hdr_buf, "\r\n", 2); + else + buffer_append_c(mstream->hdr_buf, '\n'); +} + static ssize_t read_header(struct header_filter_istream *mstream) { struct message_header_line *hdr; @@ -154,6 +164,7 @@ static ssize_t read_header(struct header_filter_istream *mstream) mstream->cur_line++; if (hdr->eoh) { + mstream->seen_eoh = TRUE; matched = TRUE; if (!mstream->header_parsed && mstream->callback != NULL) { @@ -164,10 +175,7 @@ static ssize_t read_header(struct header_filter_istream *mstream) if (!matched) continue; - if (mstream->crlf) - buffer_append(mstream->hdr_buf, "\r\n", 2); - else - buffer_append_c(mstream->hdr_buf, '\n'); + add_eol(mstream); continue; } @@ -207,13 +215,8 @@ static ssize_t read_header(struct header_filter_istream *mstream) } buffer_append(mstream->hdr_buf, hdr->value, hdr->value_len); - if (!hdr->no_newline) { - if (mstream->crlf) { - buffer_append(mstream->hdr_buf, - "\r\n", 2); - } else - buffer_append_c(mstream->hdr_buf, '\n'); - } + if (!hdr->no_newline) + add_eol(mstream); if (mstream->skip_count >= mstream->hdr_buf->used) { /* we need more */ @@ -230,6 +233,11 @@ static ssize_t read_header(struct header_filter_istream *mstream) } } + if (!mstream->seen_eoh && mstream->add_missing_eoh) { + mstream->seen_eoh = TRUE; + add_eol(mstream); + } + /* don't copy eof here because we're only returning headers here. the body will be returned in separate read() call. */ mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos); @@ -349,6 +357,7 @@ static void i_stream_header_filter_seek(struct istream_private *stream, mstream->skip_count = v_offset; mstream->cur_line = 0; mstream->header_read = FALSE; + mstream->seen_eoh = FALSE; } else { /* body */ v_offset += mstream->header_size.physical_size - @@ -414,6 +423,7 @@ i_stream_create_header_filter(struct istream *input, mstream->exclude = (flags & HEADER_FILTER_EXCLUDE) != 0; mstream->crlf = (flags & HEADER_FILTER_NO_CR) == 0; mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0; + mstream->add_missing_eoh = (flags & HEADER_FILTER_ADD_MISSING_EOH) != 0; mstream->istream.iostream.destroy = i_stream_header_filter_destroy; mstream->istream.iostream.set_max_buffer_size = diff --git a/src/lib-mail/istream-header-filter.h b/src/lib-mail/istream-header-filter.h index fd465500a0..4a4490a9ac 100644 --- a/src/lib-mail/istream-header-filter.h +++ b/src/lib-mail/istream-header-filter.h @@ -3,14 +3,16 @@ enum header_filter_flags { /* Include only specified headers in output.*/ - HEADER_FILTER_INCLUDE = 0x01, + HEADER_FILTER_INCLUDE = 0x01, /* Exclude specified headers from output. */ - HEADER_FILTER_EXCLUDE = 0x02, + HEADER_FILTER_EXCLUDE = 0x02, /* Use LF linefeeds instead of CRLF. */ - HEADER_FILTER_NO_CR = 0x04, + HEADER_FILTER_NO_CR = 0x04, /* Return EOF at the beginning of message body. */ - HEADER_FILTER_HIDE_BODY = 0x08 + HEADER_FILTER_HIDE_BODY = 0x08, + /* If the empty "end of headers" line doesn't exist, add it. */ + HEADER_FILTER_ADD_MISSING_EOH = 0x10 }; struct message_header_line;