annotate src/lib-mail/istream-header-filter.c @ 9006:06bd1266f0c7 HEAD

istreams: Fixed some parent stream seeking issues.
author Timo Sirainen <tss@iki.fi>
date Fri, 01 May 2009 14:50:08 -0400
parents b9faf4db2a9f
children b1a27ed69e60
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8590
b9faf4db2a9f Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents: 8526
diff changeset
1 /* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
4 #include "array.h"
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "message-parser.h"
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "istream-internal.h"
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream-header-filter.h"
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include <stdlib.h>
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct header_filter_istream {
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
12 struct istream_private istream;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
13 pool_t pool;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
15 struct message_header_parser_ctx *hdr_ctx;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
17 const char **headers;
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
18 unsigned int headers_count;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
19
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
20 header_filter_callback *callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
21 void *context;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
22
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
23 buffer_t *hdr_buf;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 struct message_size header_size;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
25 uoff_t skip_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
26
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
27 unsigned int cur_line, parsed_lines;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
28 ARRAY_DEFINE(match_change_lines, unsigned int);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
29
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
30 unsigned int header_read:1;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
31 unsigned int seen_eoh:1;
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
32 unsigned int header_parsed:1;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
33 unsigned int exclude:1;
2436
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
34 unsigned int crlf:1;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
35 unsigned int hide_body:1;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
36 unsigned int add_missing_eoh:1;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 };
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
39 header_filter_callback *null_header_filter_callback = NULL;
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
40
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
41 static void i_stream_header_filter_destroy(struct iostream_private *stream)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
46 if (mstream->hdr_ctx != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
47 message_parse_header_deinit(&mstream->hdr_ctx);
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
48 i_stream_unref(&mstream->istream.parent);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
49 if (array_is_created(&mstream->match_change_lines))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
50 array_free(&mstream->match_change_lines);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6420
diff changeset
51 pool_unref(&mstream->pool);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
6415
b0096861c390 Renamed struct _[io]stream to struct [io]stream_private. Also removed _
Timo Sirainen <tss@iki.fi>
parents: 6411
diff changeset
54 static void
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
55 i_stream_header_filter_set_max_buffer_size(struct iostream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
56 size_t max_size)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
6559
15a9ce2cc0ab Always keep a usable value in stream->max_buffer_size.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
61 mstream->istream.max_buffer_size = max_size;
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
62 i_stream_set_max_buffer_size(mstream->istream.parent, max_size);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
65 static ssize_t
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
66 read_mixed(struct header_filter_istream *mstream, size_t body_highwater_size)
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
67 {
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
68 const unsigned char *data;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
69 size_t pos;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
70 ssize_t ret;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
71
6571
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
72 if (mstream->hide_body) {
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
73 mstream->istream.istream.eof = TRUE;
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
74 return -1;
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
75 }
ed09701ff3d0 Last change broke HEADER_FILTER_HIDE_BODY flag.
Timo Sirainen <tss@iki.fi>
parents: 6567
diff changeset
76
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
77 data = i_stream_get_data(mstream->istream.parent, &pos);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
78 if (pos == body_highwater_size) {
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
79 ret = i_stream_read(mstream->istream.parent);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
80 mstream->istream.istream.stream_errno =
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
81 mstream->istream.parent->stream_errno;
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
82 mstream->istream.istream.eof = mstream->istream.parent->eof;
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
83
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
84 if (ret <= 0)
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
85 return ret;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
86
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
87 data = i_stream_get_data(mstream->istream.parent, &pos);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
88 }
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
89 i_assert(pos > body_highwater_size);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
90 buffer_append(mstream->hdr_buf, data + body_highwater_size,
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
91 pos - body_highwater_size);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
92
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
93 mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
94 ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
95 i_assert(ret > 0);
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
96 mstream->istream.pos = pos;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
97 return ret;
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
98 }
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
99
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
100 static int cmp_uint(const void *p1, const void *p2)
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
101 {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
102 const unsigned int *i1 = p1, *i2 = p2;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
103
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
104 return *i1 < *i2 ? -1 :
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
105 (*i1 > *i2 ? 1 : 0);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
106 }
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
107
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
108 static bool match_line_changed(struct header_filter_istream *mstream)
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
109 {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
110 const unsigned int *lines;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
111 unsigned int count;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
112
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
113 if (!array_is_created(&mstream->match_change_lines))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
114 return FALSE;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
115
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
116 lines = array_get(&mstream->match_change_lines, &count);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
117 return bsearch(&mstream->cur_line, lines, count, sizeof(*lines),
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
118 cmp_uint) != NULL;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
119 }
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
120
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
121 static void add_eol(struct header_filter_istream *mstream)
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
122 {
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
123 if (mstream->crlf)
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
124 buffer_append(mstream->hdr_buf, "\r\n", 2);
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
125 else
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
126 buffer_append_c(mstream->hdr_buf, '\n');
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
127 }
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
128
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
129 static ssize_t read_header(struct header_filter_istream *mstream)
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
130 {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
131 struct message_header_line *hdr;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
132 uoff_t highwater_offset;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
133 size_t pos;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
134 ssize_t ret;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3799
diff changeset
135 bool matched;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3799
diff changeset
136 int hdr_ret;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
137
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
138 if (mstream->hdr_ctx == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
139 mstream->hdr_ctx =
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
140 message_parse_header_init(mstream->istream.parent,
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
141 NULL, 0);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
142 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
143
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
144 /* remove skipped data from hdr_buf */
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
145 buffer_copy(mstream->hdr_buf, 0,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
146 mstream->hdr_buf, mstream->istream.skip, (size_t)-1);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
147
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
148 mstream->istream.pos -= mstream->istream.skip;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
149 mstream->istream.skip = 0;
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
150 buffer_set_used_size(mstream->hdr_buf, mstream->istream.pos);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
151
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
152 if (mstream->header_read) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
153 highwater_offset = mstream->istream.istream.v_offset +
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
154 (mstream->istream.pos - mstream->istream.skip);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
155 if (highwater_offset >= mstream->header_size.virtual_size) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
156 /* we want to return mixed headers and body */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
157 size_t body_highwater_size = highwater_offset -
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
158 mstream->header_size.virtual_size;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
159 return read_mixed(mstream, body_highwater_size);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
160 }
6567
b8442b2e3c04 Support returning mixed header and body data in read().
Timo Sirainen <tss@iki.fi>
parents: 6565
diff changeset
161 }
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
162
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
163 while ((hdr_ret = message_parse_header_next(mstream->hdr_ctx,
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
164 &hdr)) > 0) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
165 mstream->cur_line++;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
166
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
167 if (hdr->eoh) {
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
168 mstream->seen_eoh = TRUE;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
169 matched = TRUE;
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
170 if (!mstream->header_parsed &&
2443
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
171 mstream->callback != NULL) {
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
172 mstream->callback(hdr, &matched,
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
173 mstream->context);
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
174 }
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
175
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
176 if (!matched)
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
177 continue;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
178
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
179 add_eol(mstream);
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
180 continue;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
181 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
182
2989
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
183 matched = mstream->headers_count == 0 ? FALSE :
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
184 bsearch(hdr->name, mstream->headers,
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
185 mstream->headers_count,
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
186 sizeof(*mstream->headers),
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
187 bsearch_strcasecmp) != NULL;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
188 if (mstream->callback == NULL) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
189 /* nothing gets excluded */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
190 } else if (mstream->cur_line > mstream->parsed_lines) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
191 /* first time in this line */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
192 bool orig_matched = matched;
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
193
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
194 mstream->parsed_lines = mstream->cur_line;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
195 mstream->callback(hdr, &matched, mstream->context);
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
196 if (matched != orig_matched) {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
197 i_array_init(&mstream->match_change_lines, 8);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
198 array_append(&mstream->match_change_lines,
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
199 &mstream->cur_line, 1);
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
200 }
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
201 } else {
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
202 /* second time in this line. was it excluded by the
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
203 callback the first time? */
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
204 if (match_line_changed(mstream))
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
205 matched = !matched;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
206 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
207
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
208 if (matched == mstream->exclude) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
209 /* ignore */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
210 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
211 if (!hdr->continued) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
212 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
213 hdr->name, hdr->name_len);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
214 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
215 hdr->middle, hdr->middle_len);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
216 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
217 buffer_append(mstream->hdr_buf,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
218 hdr->value, hdr->value_len);
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
219 if (!hdr->no_newline)
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
220 add_eol(mstream);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
221
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
222 if (mstream->skip_count >= mstream->hdr_buf->used) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
223 /* we need more */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
224 mstream->skip_count -= mstream->hdr_buf->used;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
225 buffer_set_used_size(mstream->hdr_buf, 0);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
226 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
227 if (mstream->skip_count > 0) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
228 mstream->istream.skip =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
229 mstream->skip_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
230 mstream->skip_count = 0;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
231 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
232 break;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
233 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
234 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
235 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
236
8526
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
237 if (hdr_ret < 0) {
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
238 if (mstream->istream.parent->stream_errno != 0) {
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
239 mstream->istream.istream.stream_errno =
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
240 mstream->istream.parent->stream_errno;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
241 mstream->istream.istream.eof =
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
242 mstream->istream.parent->eof;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
243 return -1;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
244 }
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
245 if (!mstream->seen_eoh && mstream->add_missing_eoh) {
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
246 mstream->seen_eoh = TRUE;
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
247 add_eol(mstream);
c63cc3580150 Message parsing/reading: If read returns failure, don't ignore the error.
Timo Sirainen <tss@iki.fi>
parents: 8280
diff changeset
248 }
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
249 }
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
250
3440
2280ed0a9812 EOF change fix. Should finally properly fix APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
251 /* don't copy eof here because we're only returning headers here.
2280ed0a9812 EOF change fix. Should finally properly fix APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
252 the body will be returned in separate read() call. */
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
253 mstream->istream.buffer = buffer_get_data(mstream->hdr_buf, &pos);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
254 ret = (ssize_t)(pos - mstream->istream.pos - mstream->istream.skip);
8280
116202a99576 Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 8201
diff changeset
255 i_assert(ret >= 0);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
256 mstream->istream.pos = pos;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
257
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
258 if (hdr_ret == 0) {
8201
979ce2cb7517 header filter istream: Fixed previosly added assert.
Timo Sirainen <tss@iki.fi>
parents: 8196
diff changeset
259 /* need more data to finish parsing headers. we may have some
979ce2cb7517 header filter istream: Fixed previosly added assert.
Timo Sirainen <tss@iki.fi>
parents: 8196
diff changeset
260 data already available though. */
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
261 return ret;
8196
40a07553606c Input streams: Improved error handling and added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 7608
diff changeset
262 }
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
263
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
264 if (hdr == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
265 /* finished */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
266 message_parse_header_deinit(&mstream->hdr_ctx);
2437
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
267 mstream->hdr_ctx = NULL;
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
268
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
269 if (!mstream->header_parsed && mstream->callback != NULL)
2435
288eb0d0ca7d We didn't call callback with NULL header at the end.
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
270 mstream->callback(NULL, &matched, mstream->context);
3455
e04d4a496a0b If we seek back to beginning of headers, don't call callback again for
Timo Sirainen <tss@iki.fi>
parents: 3440
diff changeset
271 mstream->header_parsed = TRUE;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
272 mstream->header_read = TRUE;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
273
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
274 mstream->header_size.physical_size =
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
275 mstream->istream.parent->v_offset;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
276 mstream->header_size.virtual_size =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
277 mstream->istream.istream.v_offset + pos;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
278 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
279
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
280 if (ret == 0) {
5660
6533e11eda80 If there's no message body, the final read() should return -1, not -2
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
281 /* we're at the end of headers. */
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
282 i_assert(hdr == NULL);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
283 i_assert(mstream->istream.istream.v_offset +
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
284 mstream->istream.pos ==
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
285 mstream->header_size.virtual_size);
5660
6533e11eda80 If there's no message body, the final read() should return -1, not -2
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
286
6533e11eda80 If there's no message body, the final read() should return -1, not -2
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
287 return read_header(mstream);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
288 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
289
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
290 return ret;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
291 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
292
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
293 static ssize_t i_stream_header_filter_read(struct istream_private *stream)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 ssize_t ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
299 if (!mstream->header_read ||
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
300 stream->istream.v_offset < mstream->header_size.virtual_size) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
301 ret = read_header(mstream);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
302 if (ret != -2 || stream->pos != stream->skip)
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
303 return ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
306 if (mstream->hide_body) {
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
307 stream->istream.eof = TRUE;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
308 return -1;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
309 }
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
310
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
311 i_stream_seek(stream->parent, mstream->istream.parent_start_offset +
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
312 stream->istream.v_offset -
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
313 mstream->header_size.virtual_size +
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
314 mstream->header_size.physical_size);
9006
06bd1266f0c7 istreams: Fixed some parent stream seeking issues.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
315 return i_stream_read_copy_from_parent(&stream->istream);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
318 static void parse_header(struct header_filter_istream *mstream)
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
319 {
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
320 size_t pos;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
321
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
322 while (!mstream->header_read) {
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
323 if (i_stream_header_filter_read(&mstream->istream) == -1)
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
324 break;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
325
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
326 (void)i_stream_get_data(&mstream->istream.istream, &pos);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
327 i_stream_skip(&mstream->istream.istream, pos);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
328 }
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
329 }
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
330
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
331 static void i_stream_header_filter_seek(struct istream_private *stream,
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
332 uoff_t v_offset, bool mark ATTR_UNUSED)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
337 parse_header(mstream);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 stream->istream.v_offset = v_offset;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
339 stream->skip = stream->pos = 0;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
340 stream->buffer = NULL;
6742
87a0f26edb39 Handle returning mixed header+body multiple times without breaking. Handle
Timo Sirainen <tss@iki.fi>
parents: 6571
diff changeset
341 buffer_set_used_size(mstream->hdr_buf, 0);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
342
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
343 if (mstream->hdr_ctx != NULL) {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
344 message_parse_header_deinit(&mstream->hdr_ctx);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
345 mstream->hdr_ctx = NULL;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
346 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
347
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 if (v_offset < mstream->header_size.virtual_size) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
349 /* seek into headers. we'll have to re-parse them, use
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
350 skip_count to set the wanted position */
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
351 i_stream_seek(stream->parent, stream->parent_start_offset);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
352 mstream->skip_count = v_offset;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
353 mstream->cur_line = 0;
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
354 mstream->header_read = FALSE;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
355 mstream->seen_eoh = FALSE;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 } else {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
357 /* body */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 v_offset += mstream->header_size.physical_size -
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 mstream->header_size.virtual_size;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
360 i_stream_seek(stream->parent,
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
361 stream->parent_start_offset + v_offset);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
365 static void ATTR_NORETURN
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
366 i_stream_header_filter_sync(struct istream_private *stream ATTR_UNUSED)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
367 {
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
368 i_panic("istream-header-filter sync() not implemented");
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
369 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
370
3647
7af5162d934c Added exact parameter to i_stream_stat()
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
371 static const struct stat *
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
372 i_stream_header_filter_stat(struct istream_private *stream, bool exact)
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
373 {
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
374 struct header_filter_istream *mstream =
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
375 (struct header_filter_istream *)stream;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
376 const struct stat *st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
377
7030
1a89a1509e81 Use istream_private->parent pointer globally instead of each filter stream
Timo Sirainen <tss@iki.fi>
parents: 6742
diff changeset
378 st = i_stream_stat(stream->parent, exact);
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
379 if (st == NULL || st->st_size == -1 || !exact)
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
380 return st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
381
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
382 parse_header(mstream);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
383
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
384 stream->statbuf = *st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
385 stream->statbuf.st_size -=
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
386 (off_t)mstream->header_size.physical_size -
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
387 (off_t)mstream->header_size.virtual_size;
3267
10d67baec28f Don't panic in stat(). o_stream_send_istream() wants to know the file size.
Timo Sirainen <tss@iki.fi>
parents: 3241
diff changeset
388 return &stream->statbuf;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
389 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
390
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4823
diff changeset
391 #undef i_stream_create_header_filter
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 struct istream *
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
393 i_stream_create_header_filter(struct istream *input,
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
394 enum header_filter_flags flags,
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
395 const char *const *headers,
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
396 unsigned int headers_count,
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2295
diff changeset
397 header_filter_callback *callback, void *context)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 struct header_filter_istream *mstream;
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
400 unsigned int i;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
402 i_assert((flags & (HEADER_FILTER_INCLUDE|HEADER_FILTER_EXCLUDE)) != 0);
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
403
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
404 mstream = i_new(struct header_filter_istream, 1);
7485
8bed019c834d Memory pool allocation tweaks.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
405 mstream->pool = pool_alloconly_create(MEMPOOL_GROWING
8bed019c834d Memory pool allocation tweaks.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
406 "header filter stream", 4096);
6559
15a9ce2cc0ab Always keep a usable value in stream->max_buffer_size.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
407 mstream->istream.max_buffer_size = input->real_stream->max_buffer_size;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
408
2793
19a6ff9fed58 Don't crash if no headers are given (fixes FETCH BODY[n.MIME] crashing)
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
409 mstream->headers = headers_count == 0 ? NULL :
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
410 p_new(mstream->pool, const char *, headers_count);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
411 for (i = 0; i < headers_count; i++)
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
412 mstream->headers[i] = p_strdup(mstream->pool, headers[i]);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
413 mstream->headers_count = headers_count;
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 5660
diff changeset
414 mstream->hdr_buf = buffer_create_dynamic(mstream->pool, 1024);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
416 mstream->callback = callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
417 mstream->context = context;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
418 mstream->exclude = (flags & HEADER_FILTER_EXCLUDE) != 0;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
419 mstream->crlf = (flags & HEADER_FILTER_NO_CR) == 0;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
420 mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
7598
50120b047f0a header filter istream: Added HEADER_FILTER_ADD_MISSING_EOH flag to add
Timo Sirainen <tss@iki.fi>
parents: 7485
diff changeset
421 mstream->add_missing_eoh = (flags & HEADER_FILTER_ADD_MISSING_EOH) != 0;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
423 mstream->istream.iostream.destroy = i_stream_header_filter_destroy;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
424 mstream->istream.iostream.set_max_buffer_size =
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
425 i_stream_header_filter_set_max_buffer_size;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
6420
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
427 mstream->istream.read = i_stream_header_filter_read;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
428 mstream->istream.seek = i_stream_header_filter_seek;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
429 mstream->istream.sync = i_stream_header_filter_sync;
a8b515e1a26f Removed _ prefixes from function names.
Timo Sirainen <tss@iki.fi>
parents: 6419
diff changeset
430 mstream->istream.stat = i_stream_header_filter_stat;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431
5106
81394e71f92a Added istream->blocking setting. It's now used to assert-crash early if a
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
432 mstream->istream.istream.blocking = input->blocking;
3239
904a268921af Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents: 2990
diff changeset
433 mstream->istream.istream.seekable = input->seekable;
7032
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
434
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
435 i_stream_ref(input);
85cf52f0bc64 i_stream_create() now takes parent stream as parameter and internally sets
Timo Sirainen <tss@iki.fi>
parents: 7030
diff changeset
436 return i_stream_create(&mstream->istream, input, -1);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }