Mercurial > dovecot > core-2.2
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 |
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 | 70 mstream->istream.istream.v_offset + |
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 | 98 mstream->callback != NULL) { |
99 mstream->callback(hdr, &matched, | |
100 mstream->context); | |
101 } | |
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 | 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 | 225 } else { |
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 | 232 ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) : |
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 | 238 static void parse_header(struct header_filter_istream *mstream) |
239 { | |
240 size_t pos; | |
241 | |
242 while (!mstream->header_read) { | |
243 if (_read(&mstream->istream) == -1) | |
244 break; | |
245 | |
246 (void)i_stream_get_data(&mstream->istream.istream, &pos); | |
247 i_stream_skip(&mstream->istream.istream, pos); | |
248 } | |
249 } | |
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 | 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 | 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 | 290 struct header_filter_istream *mstream = |
291 (struct header_filter_istream *)stream; | |
292 const struct stat *st; | |
293 | |
294 st = i_stream_stat(mstream->input, exact); | |
295 if (st == NULL || st->st_size == -1 || !exact) | |
296 return st; | |
297 | |
298 parse_header(mstream); | |
299 | |
300 stream->statbuf = *st; | |
301 stream->statbuf.st_size -= | |
302 (off_t)mstream->header_size.physical_size - | |
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 | 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 } |