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