dovecot-1.1: header filter istream: Added HEADER_FILTER_ADD_MISS...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Jun 2 21:20:26 EEST 2008
details: http://hg.dovecot.org/dovecot-1.1/rev/50120b047f0a
changeset: 7598:50120b047f0a
user: Timo Sirainen <tss at iki.fi>
date: Mon Jun 02 21:19:26 2008 +0300
description:
header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
end-of-headers line if it's missing.
diffstat:
2 files changed, 27 insertions(+), 15 deletions(-)
src/lib-mail/istream-header-filter.c | 32 +++++++++++++++++++++-----------
src/lib-mail/istream-header-filter.h | 10 ++++++----
diffs (119 lines):
diff -r f27e6f583817 -r 50120b047f0a src/lib-mail/istream-header-filter.c
--- a/src/lib-mail/istream-header-filter.c Mon Jun 02 21:06:27 2008 +0300
+++ b/src/lib-mail/istream-header-filter.c Mon Jun 02 21:19:26 2008 +0300
@@ -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;
@@ -113,6 +115,14 @@ static bool match_line_changed(struct he
lines = array_get(&mstream->match_change_lines, &count);
return bsearch(&mstream->cur_line, lines, count, sizeof(*lines),
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)
@@ -154,6 +164,7 @@ static ssize_t read_header(struct header
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
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
}
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
}
}
+ 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(
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 ist
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 -r f27e6f583817 -r 50120b047f0a src/lib-mail/istream-header-filter.h
--- a/src/lib-mail/istream-header-filter.h Mon Jun 02 21:06:27 2008 +0300
+++ b/src/lib-mail/istream-header-filter.h Mon Jun 02 21:19:26 2008 +0300
@@ -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;
More information about the dovecot-cvs
mailing list