annotate src/lib-mail/istream-header-filter.c @ 2793:19a6ff9fed58 HEAD

Don't crash if no headers are given (fixes FETCH BODY[n.MIME] crashing)
author Timo Sirainen <tss@iki.fi>
date Wed, 20 Oct 2004 23:19:57 +0300
parents f1e9f3ec8135
children 83c791a0b6d9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2003-2004 Timo Sirainen */
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"
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
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 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 struct _istream 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
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 struct istream *input;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
16 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
17
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
18 const char **headers;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
19 size_t headers_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
20
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
21 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
22 void *context;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
23
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
24 buffer_t *hdr_buf;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 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
26 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
27
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
28 unsigned int cur_line, parsed_lines;
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;
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
31 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
32 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
33 unsigned int hide_body:1;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 };
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 static void _close(struct _iostream *stream __attr_unused__)
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 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 static void _destroy(struct _iostream *stream)
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
45 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
46 message_parse_header_deinit(mstream->hdr_ctx);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 i_stream_unref(mstream->input);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
48 pool_unref(mstream->pool);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 static void _set_max_buffer_size(struct _iostream *stream, size_t max_size)
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 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 i_stream_set_max_buffer_size(mstream->input, max_size);
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
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
59 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
60 {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
61 struct message_header_line *hdr;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
62 size_t pos;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
63 ssize_t ret;
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
64 int matched, hdr_ret;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
65
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
66 if (mstream->header_read &&
2472
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
67 mstream->istream.istream.v_offset +
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
68 (mstream->istream.pos - mstream->istream.skip) ==
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
69 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
70 /* we don't support mixing headers and body.
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
71 it shouldn't be needed. */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
72 return -2;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
73 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
74
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
75 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
76 mstream->hdr_ctx =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
77 message_parse_header_init(mstream->input, NULL, FALSE);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
78 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
79
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
80 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
81 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
82
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
83 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
84 mstream->istream.skip = 0;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
85
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
86 buffer_set_used_size(mstream->hdr_buf, mstream->istream.pos);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
87
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
88 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
89 &hdr)) > 0) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
90 mstream->cur_line++;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
91
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
92 if (hdr->eoh) {
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
93 matched = TRUE;
2443
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
94 if (!mstream->header_read &&
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
95 mstream->callback != NULL) {
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
96 mstream->callback(hdr, &matched,
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
97 mstream->context);
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
98 }
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
99
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
100 if (!matched)
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
101 continue;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
102
2436
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
103 if (mstream->crlf)
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
104 buffer_append(mstream->hdr_buf, "\r\n", 2);
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
105 else
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
106 buffer_append_c(mstream->hdr_buf, '\n');
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
107 continue;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
108 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
109
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
110 matched = bsearch(hdr->name, mstream->headers,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
111 mstream->headers_count,
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
112 sizeof(*mstream->headers),
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
113 bsearch_strcasecmp) != NULL;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
114 if (mstream->cur_line > mstream->parsed_lines &&
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
115 mstream->callback != NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
116 mstream->parsed_lines = mstream->cur_line;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
117 mstream->callback(hdr, &matched, mstream->context);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
118 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
119
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
120 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
121 /* ignore */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
122 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
123 if (!hdr->continued) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
124 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
125 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
126 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
127 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
128 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
129 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
130 hdr->value, hdr->value_len);
2436
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
131 if (!hdr->no_newline) {
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
132 if (mstream->crlf) {
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
133 buffer_append(mstream->hdr_buf,
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
134 "\r\n", 2);
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
135 } else
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
136 buffer_append_c(mstream->hdr_buf, '\n');
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
137 }
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
138
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
139 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
140 /* we need more */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
141 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
142 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
143 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
144 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
145 mstream->istream.skip =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
146 mstream->skip_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
147 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
148 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
149 break;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
150 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
151 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
152 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
153
2431
8e9d8cb1e674 Removed istream.disconnected, it's too much of a special case and the only
Timo Sirainen <tss@iki.fi>
parents: 2430
diff changeset
154 mstream->istream.istream.eof = mstream->input->eof;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
155 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
156 ret = (ssize_t)(pos - 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
157 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
158
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
159 if (hdr_ret == 0)
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
160 return ret;
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
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 if (hdr == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
163 /* finished */
2437
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
164 message_parse_header_deinit(mstream->hdr_ctx);
c58f454afc6b Do the final callback after deinitializing header parser so offsets are
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
165 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
166
2435
288eb0d0ca7d We didn't call callback with NULL header at the end.
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
167 if (!mstream->header_read && mstream->callback != NULL)
288eb0d0ca7d We didn't call callback with NULL header at the end.
Timo Sirainen <tss@iki.fi>
parents: 2431
diff changeset
168 mstream->callback(NULL, &matched, mstream->context);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
169 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
170
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
171 mstream->header_size.physical_size = mstream->input->v_offset;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
172 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
173 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
174 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
175
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
176 if (ret == 0) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
177 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
178 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
179 mstream->istream.pos ==
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
180 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
181 return -2;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
182 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
183
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
184 return ret;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
185 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
186
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 static ssize_t _read(struct _istream *stream)
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 ssize_t ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 size_t pos;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
194 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
195 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
196 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
197 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
198 return ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
201 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
202 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
203 return -1;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
204 }
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
205
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 if (mstream->input->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
207 stream->istream.v_offset - mstream->header_size.virtual_size) {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 i_stream_seek(mstream->input, stream->istream.v_offset -
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 mstream->header_size.virtual_size +
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 mstream->header_size.physical_size);
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
2295
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
213 stream->buffer = i_stream_get_data(mstream->input, &pos);
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
214 if (pos <= stream->pos) {
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
215 if ((ret = i_stream_read(mstream->input)) == -2) {
2295
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
216 if (stream->skip == 0)
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
217 return -2;
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
218 }
2431
8e9d8cb1e674 Removed istream.disconnected, it's too much of a special case and the only
Timo Sirainen <tss@iki.fi>
parents: 2430
diff changeset
219 stream->istream.eof = mstream->input->eof;
2295
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
220 stream->buffer = i_stream_get_data(mstream->input, &pos);
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
221 } else {
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
222 ret = 0;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
225 stream->pos -= stream->skip;
2295
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
226 stream->skip = 0;
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
227
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
228 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
229 (ret == 0 ? 0 : -1);
2295
545c1d3ead54 Wrapper streams shouldn't try to read data if it's already buffered in main
Timo Sirainen <tss@iki.fi>
parents: 2196
diff changeset
230 stream->pos = pos;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 return ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 static void _seek(struct _istream *stream, uoff_t v_offset)
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 (struct header_filter_istream *)stream;
2581
b88b34d95c7b Seeking was broken if header hadn't been read yet.
Timo Sirainen <tss@iki.fi>
parents: 2488
diff changeset
238 size_t pos;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239
2612
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
240 while (!mstream->header_read) {
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
241 if (_read(stream) == -1)
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
242 break;
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
243
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
244 (void)i_stream_get_data(&stream->istream, &pos);
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
245 i_stream_skip(&stream->istream, pos);
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
246 }
2844c33a1be9 seek fix
Timo Sirainen <tss@iki.fi>
parents: 2581
diff changeset
247
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 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
249 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
250 stream->buffer = NULL;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
251
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
252 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
253 message_parse_header_deinit(mstream->hdr_ctx);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
254 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
255 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
256
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 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
258 /* 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
259 skip_count to set the wanted position */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
260 i_stream_seek(mstream->input, 0);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
261 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
262 mstream->cur_line = 0;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 } else {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
264 /* body */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 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
266 mstream->header_size.virtual_size;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 i_stream_seek(mstream->input, v_offset);
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 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
272 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
273 enum header_filter_flags flags,
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2295
diff changeset
274 const char *const *headers, size_t headers_count,
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2295
diff changeset
275 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
276 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 struct header_filter_istream *mstream;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
278 pool_t pool;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
279 size_t i;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
281 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
282
2488
b2993fe1337b Use larger default buffer sizes
Timo Sirainen <tss@iki.fi>
parents: 2472
diff changeset
283 pool = pool_alloconly_create("header filter stream", 2048);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 mstream = p_new(pool, struct header_filter_istream, 1);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
285 mstream->pool = pool;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
286
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 mstream->input = input;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 i_stream_ref(mstream->input);
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
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
290 mstream->headers = headers_count == 0 ? NULL :
19a6ff9fed58 Don't crash if no headers are given (fixes FETCH BODY[n.MIME] crashing)
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
291 p_new(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
292 for (i = 0; i < headers_count; i++)
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
293 mstream->headers[i] = p_strdup(pool, headers[i]);
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
294 mstream->headers_count = headers_count;
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2612
diff changeset
295 mstream->hdr_buf = buffer_create_dynamic(pool, 1024);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
297 mstream->callback = callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
298 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
299 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
300 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
301 mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 mstream->istream.iostream.close = _close;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 mstream->istream.iostream.destroy = _destroy;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 mstream->istream.iostream.set_max_buffer_size = _set_max_buffer_size;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 mstream->istream.read = _read;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 mstream->istream.seek = _seek;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 return _i_stream_create(&mstream->istream, pool, -1, 0);
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 }