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