dovecot-2.2: istream-header-filter: Allow adding more headers at...

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 12 02:26:24 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.2/rev/f329d7e1dad7
changeset: 14869:f329d7e1dad7
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 12 02:24:54 2012 +0300
description:
istream-header-filter: Allow adding more headers at the end of headers callback.

diffstat:

 src/lib-mail/istream-header-filter.c |  38 +++++++++++++++++++++++++++--------
 1 files changed, 29 insertions(+), 9 deletions(-)

diffs (82 lines):

diff -r f4de7ed984b3 -r f329d7e1dad7 src/lib-mail/istream-header-filter.c
--- a/src/lib-mail/istream-header-filter.c	Sun Aug 12 02:08:30 2012 +0300
+++ b/src/lib-mail/istream-header-filter.c	Sun Aug 12 02:24:54 2012 +0300
@@ -133,12 +133,23 @@
 		buffer_append_c(mstream->hdr_buf, '\n');
 }
 
+static ssize_t hdr_stream_update_pos(struct header_filter_istream *mstream)
+{
+	ssize_t ret;
+	size_t pos;
+
+	mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
+	ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
+	i_assert(ret >= 0);
+	mstream->istream.pos = pos;
+	return ret;
+}
+
 static ssize_t read_header(struct header_filter_istream *mstream)
 {
 	struct message_header_line *hdr;
 	uoff_t highwater_offset;
-	size_t pos;
-	ssize_t ret;
+	ssize_t ret, ret2;
 	bool matched;
 	int hdr_ret;
 
@@ -181,8 +192,10 @@
 						  mstream->context);
 			}
 
-			if (!matched)
+			if (!matched) {
+				mstream->seen_eoh = FALSE;
 				continue;
+			}
 
 			add_eol(mstream);
 			continue;
@@ -259,10 +272,7 @@
 
 	/* 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);
-	ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
-	i_assert(ret >= 0);
-	mstream->istream.pos = pos;
+	ret = hdr_stream_update_pos(mstream);
 
 	if (hdr_ret == 0) {
 		/* need more data to finish parsing headers. we may have some
@@ -275,16 +285,26 @@
 		message_parse_header_deinit(&mstream->hdr_ctx);
 		mstream->hdr_ctx = NULL;
 
-		if (!mstream->header_parsed && mstream->callback != NULL)
+		if (!mstream->header_parsed && mstream->callback != NULL) {
 			mstream->callback(mstream, NULL,
 					  &matched, mstream->context);
+			/* check if the callback added more headers.
+			   this is allowed only of EOH wasn't added yet. */
+			ret2 = hdr_stream_update_pos(mstream);
+			if (!mstream->seen_eoh)
+				ret += ret2;
+			else {
+				i_assert(ret2 == 0);
+			}
+		}
 		mstream->header_parsed = TRUE;
 		mstream->header_read = TRUE;
 
 		mstream->header_size.physical_size =
 			mstream->istream.parent->v_offset;
 		mstream->header_size.virtual_size =
-			mstream->istream.istream.v_offset + pos;
+			mstream->istream.istream.v_offset +
+			mstream->istream.pos;
 	}
 
 	if (ret == 0) {


More information about the dovecot-cvs mailing list