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