annotate src/lib-mail/istream-header-filter.c @ 4327:dbae2347dcdb HEAD

Handle i_stream_stat() better.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 Jun 2006 22:26:53 +0300
parents 928229f8b3e6
children 414c0c45040e
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;
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
17 uoff_t start_offset;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
19 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
20 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
21
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
22 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
23 void *context;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
24
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
25 buffer_t *hdr_buf;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 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
27 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
28
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
29 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
30
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
31 unsigned int header_read: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;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 };
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 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
39 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 }
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 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
43 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
47 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
48 message_parse_header_deinit(&mstream->hdr_ctx);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
49 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
50 pool_unref(mstream->pool);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 }
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 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
54 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 (struct header_filter_istream *)stream;
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 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
59 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
61 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
62 {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
63 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
64 size_t pos;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
65 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
66 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
67 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
68
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
69 if (mstream->header_read &&
2472
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
70 mstream->istream.istream.v_offset +
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
71 (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
72 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
73 /* 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
74 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
75 return -2;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
76 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
77
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
78 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
79 mstream->hdr_ctx =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
80 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
81 }
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 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
84 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
85
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
86 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
87 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
88
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
89 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
90
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
91 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
92 &hdr)) > 0) {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
93 mstream->cur_line++;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
94
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
95 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
96 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
97 if (!mstream->header_parsed &&
2443
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
98 mstream->callback != NULL) {
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
99 mstream->callback(hdr, &matched,
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
100 mstream->context);
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
101 }
aa6b874f7515 Call callback for EOH too.
Timo Sirainen <tss@iki.fi>
parents: 2437
diff changeset
102
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
103 if (!matched)
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
104 continue;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
105
2436
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
106 if (mstream->crlf)
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
107 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
108 else
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
109 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
110 continue;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
111 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
112
2989
83c791a0b6d9 Don't call bsearch() with zero member count, it crashes in Solaris.
Timo Sirainen <tss@iki.fi>
parents: 2793
diff changeset
113 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
114 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
115 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
116 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
117 bsearch_strcasecmp) != NULL;
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
118 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
119 mstream->callback != NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
120 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
121 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
122 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
123
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
124 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
125 /* ignore */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
126 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
127 if (!hdr->continued) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
128 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
129 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
130 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
131 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
132 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
133 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
134 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
135 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
136 if (mstream->crlf) {
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
137 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
138 "\r\n", 2);
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
139 } else
f8c4ad92092c header filter can now optionally use either LF or CRLF linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 2435
diff changeset
140 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
141 }
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 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
144 /* we need more */
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
145 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
146 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
147 } else {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
148 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
149 mstream->istream.skip =
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
150 mstream->skip_count;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
151 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
152 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
153 break;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
154 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
155 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
156 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
157
3440
2280ed0a9812 EOF change fix. Should finally properly fix APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
158 /* 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
159 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
160 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
161 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
162 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
163
2430
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
164 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
165 return ret;
7c1dc4a7db3a message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents: 2429
diff changeset
166
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
167 if (hdr == NULL) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
168 /* finished */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
169 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
170 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
171
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
172 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
173 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
174 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
175 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
176
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
177 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
178 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
179 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
180 }
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 if (ret == 0) {
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
183 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
184 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
185 mstream->istream.pos ==
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
186 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
187 return -2;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
188 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
189
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
190 return ret;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
191 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
192
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 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
194 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 ssize_t ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 size_t pos;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
200 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
201 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
202 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
203 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
204 return ret;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
207 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
208 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
209 return -1;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
210 }
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
211
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
212 i_stream_seek(mstream->input, mstream->start_offset +
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
213 stream->istream.v_offset -
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
214 mstream->header_size.virtual_size +
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
215 mstream->header_size.physical_size);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
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
217 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
218 if (pos <= stream->pos) {
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
219 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
220 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
221 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
222 }
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
223 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
224 stream->buffer = i_stream_get_data(mstream->input, &pos);
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
225 } else {
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
226 ret = 0;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
229 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
230 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
231
2444
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
232 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
881e265febfa Fixes for nonblocking streams.
Timo Sirainen <tss@iki.fi>
parents: 2443
diff changeset
233 (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
234 stream->pos = pos;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 return ret;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
238 static void parse_header(struct header_filter_istream *mstream)
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
239 {
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
240 size_t pos;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
241
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
242 while (!mstream->header_read) {
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
243 if (_read(&mstream->istream) == -1)
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
244 break;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
245
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
246 (void)i_stream_get_data(&mstream->istream.istream, &pos);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
247 i_stream_skip(&mstream->istream.istream, pos);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
248 }
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
249 }
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
250
3629
e05a1af4bbc7 Added i_stream_seek_mark() and used it
Timo Sirainen <tss@iki.fi>
parents: 3455
diff changeset
251 static void _seek(struct _istream *stream, uoff_t v_offset,
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
252 bool mark __attr_unused__)
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 struct header_filter_istream *mstream =
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 (struct header_filter_istream *)stream;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
257 parse_header(mstream);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 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
259 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
260 stream->buffer = NULL;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
261
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
262 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
263 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
264 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
265 }
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
266
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 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
268 /* 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
269 skip_count to set the wanted position */
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
270 i_stream_seek(mstream->input, mstream->start_offset);
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
271 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
272 mstream->cur_line = 0;
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
273 mstream->header_read = FALSE;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 } else {
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
275 /* body */
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 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
277 mstream->header_size.virtual_size;
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
278 i_stream_seek(mstream->input, mstream->start_offset + v_offset);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 }
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
282 static void _sync(struct _istream *stream __attr_unused__)
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
283 {
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
284 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
285 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
286
3647
7af5162d934c Added exact parameter to i_stream_stat()
Timo Sirainen <tss@iki.fi>
parents: 3629
diff changeset
287 static const struct stat *
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
288 _stat(struct _istream *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
289 {
4327
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
290 struct header_filter_istream *mstream =
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
291 (struct header_filter_istream *)stream;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
292 const struct stat *st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
293
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
294 st = i_stream_stat(mstream->input, exact);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
295 if (st == NULL || st->st_size == -1 || !exact)
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
296 return st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
297
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
298 parse_header(mstream);
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
299
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
300 stream->statbuf = *st;
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
301 stream->statbuf.st_size -=
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
302 (off_t)mstream->header_size.physical_size -
dbae2347dcdb Handle i_stream_stat() better.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
303 (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
304 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
305 }
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
306
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 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
308 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
309 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
310 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
311 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
312 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
313 {
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 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
315 pool_t pool;
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3267
diff changeset
316 unsigned int i;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2444
diff changeset
318 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
319
3799
87793c933996 Grow default pool size
Timo Sirainen <tss@iki.fi>
parents: 3647
diff changeset
320 pool = pool_alloconly_create("header filter stream", 4096);
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 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
322 mstream->pool = pool;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
323
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 mstream->input = input;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 i_stream_ref(mstream->input);
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326
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
327 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
328 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
329 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
330 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
331 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
332 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
333
2429
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
334 mstream->callback = callback;
92f92b3c447b istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
335 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
336 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
337 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
338 mstream->hide_body = (flags & HEADER_FILTER_HIDE_BODY) != 0;
2990
57f91991f4ca Seeking backwards to headers wasn't working.
Timo Sirainen <tss@iki.fi>
parents: 2989
diff changeset
339 mstream->start_offset = input->v_offset;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 mstream->istream.iostream.close = _close;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 mstream->istream.iostream.destroy = _destroy;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 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
344
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 mstream->istream.read = _read;
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 mstream->istream.seek = _seek;
3241
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
347 mstream->istream.sync = _sync;
b79853b4b005 Replaced i_stream_get_size() with i_stream_stat(). Added i_stream_sync().
Timo Sirainen <tss@iki.fi>
parents: 3239
diff changeset
348 mstream->istream.stat = _stat;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
3239
904a268921af Added seekable variable to struct istream.
Timo Sirainen <tss@iki.fi>
parents: 2990
diff changeset
350 mstream->istream.istream.seekable = input->seekable;
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 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
352 }