]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
authorTimo Sirainen <tss@iki.fi>
Mon, 2 Jun 2008 18:19:26 +0000 (21:19 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 2 Jun 2008 18:19:26 +0000 (21:19 +0300)
end-of-headers line if it's missing.

--HG--
branch : HEAD

src/lib-mail/istream-header-filter.c
src/lib-mail/istream-header-filter.h

index 175ba546ba6bf866c49de15aa510e148ce7201a4..20563a848109f11928cd0cc074d1d844b1bc80e6 100644 (file)
@@ -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 =
index fd465500a0a3e7d89e22989c6cf6f629a2e9ffbd..4a4490a9ac29f162d796aad96315d0d35eb36e76 100644 (file)
@@ -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;