Mercurial > dovecot > core-2.2
annotate src/lib-mail/istream-header-filter.c @ 2430:7c1dc4a7db3a HEAD
message_parse_header_next() can now return "need more data" with nonblocking
input streams.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 22 Aug 2004 06:19:58 +0300 |
parents | 92f92b3c447b |
children | 8e9d8cb1e674 |
rev | line source |
---|---|
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2003-2004 Timo Sirainen */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "buffer.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "message-parser.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "istream-internal.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "istream-header-filter.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include <stdlib.h> |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 struct header_filter_istream { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 struct _istream istream; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
13 pool_t pool; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 struct istream *input; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
16 struct message_header_parser_ctx *hdr_ctx; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
18 const char **headers; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
19 size_t headers_count; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
20 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
21 header_filter_callback *callback; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
22 void *context; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
23 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
24 buffer_t *hdr_buf; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct message_size header_size; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
26 uoff_t skip_count; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
27 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
28 unsigned int cur_line, parsed_lines; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
29 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
30 unsigned int header_read:1; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
31 unsigned int filter:1; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 }; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 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
|
35 { |
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 _destroy(struct _iostream *stream) |
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 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
43 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
|
44 message_parse_header_deinit(mstream->hdr_ctx); |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 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
|
46 pool_unref(mstream->pool); |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 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
|
50 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 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
|
55 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
57 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
|
58 { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
59 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
|
60 size_t pos; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
61 ssize_t ret; |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
62 int matched, hdr_ret; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
63 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
64 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
|
65 mstream->istream.istream.v_offset + mstream->istream.pos == |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
66 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
|
67 /* 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
|
68 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
|
69 return -2; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
70 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
71 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
72 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
|
73 mstream->hdr_ctx = |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
74 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
|
75 } |
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 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
|
78 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
|
79 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
80 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
|
81 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
|
82 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
83 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
|
84 |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
85 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
|
86 &hdr)) > 0) { |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
87 mstream->cur_line++; |
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 if (hdr->eoh) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
90 buffer_append(mstream->hdr_buf, "\r\n", 2); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
91 break; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
92 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
93 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
94 matched = bsearch(hdr->name, mstream->headers, |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
95 mstream->headers_count, |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
96 sizeof(*mstream->headers), |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
97 bsearch_strcasecmp) != NULL; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
98 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
|
99 mstream->callback != NULL) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
100 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
|
101 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
|
102 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
103 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
104 if (matched == mstream->filter) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
105 /* ignore */ |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
106 } else { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
107 if (!hdr->continued) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
108 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
|
109 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
|
110 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
|
111 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
|
112 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
113 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
|
114 hdr->value, hdr->value_len); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
115 buffer_append(mstream->hdr_buf, "\r\n", 2); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
116 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
117 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
|
118 /* we need more */ |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
119 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
|
120 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
|
121 } else { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
122 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
|
123 mstream->istream.skip = |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
124 mstream->skip_count; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
125 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
|
126 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
127 break; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
128 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
129 } |
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 |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
132 mstream->istream.istream.disconnected = mstream->input->disconnected; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
133 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
|
134 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
|
135 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
|
136 |
2430
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
137 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
|
138 return ret; |
7c1dc4a7db3a
message_parse_header_next() can now return "need more data" with nonblocking
Timo Sirainen <tss@iki.fi>
parents:
2429
diff
changeset
|
139 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
140 if (hdr == NULL) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
141 /* finished */ |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
142 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
|
143 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
144 message_parse_header_deinit(mstream->hdr_ctx); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
145 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
|
146 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
147 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
|
148 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
|
149 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
|
150 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
151 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
152 if (ret == 0) { |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
153 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
|
154 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
|
155 mstream->istream.pos == |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
156 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
|
157 return -2; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
158 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
159 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
160 return ret; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
161 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
162 |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 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
|
164 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 ssize_t ret; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 size_t pos; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
170 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
|
171 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
|
172 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
|
173 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
|
174 return ret; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 if (mstream->input->v_offset - mstream->header_size.physical_size != |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 stream->istream.v_offset - mstream->header_size.virtual_size) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 i_stream_seek(mstream->input, stream->istream.v_offset - |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 mstream->header_size.virtual_size + |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 mstream->header_size.physical_size); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 |
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
|
184 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
|
185 if (pos <= stream->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
|
186 if (i_stream_read(mstream->input) == -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
|
187 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
|
188 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
|
189 } |
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
|
190 stream->istream.disconnected = mstream->input->disconnected; |
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
|
191 stream->buffer = i_stream_get_data(mstream->input, &pos); |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
194 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
|
195 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
|
196 |
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
|
197 ret = pos <= stream->pos ? -1 : |
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
|
198 (ssize_t) (pos - stream->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
|
199 stream->pos = pos; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 return ret; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 static void _seek(struct _istream *stream, uoff_t v_offset) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 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
|
209 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
|
210 stream->buffer = NULL; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
211 |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
212 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
|
213 message_parse_header_deinit(mstream->hdr_ctx); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
214 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
|
215 } |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
216 |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 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
|
218 /* 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
|
219 skip_count to set the wanted position */ |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
220 i_stream_seek(mstream->input, 0); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
221 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
|
222 mstream->cur_line = 0; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 } else { |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
224 /* body */ |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 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
|
226 mstream->header_size.virtual_size; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 i_stream_seek(mstream->input, v_offset); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 struct istream * |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
232 i_stream_create_header_filter(struct istream *input, int filter, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2295
diff
changeset
|
233 const char *const *headers, size_t headers_count, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2295
diff
changeset
|
234 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
|
235 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 struct header_filter_istream *mstream; |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
237 pool_t pool; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
238 size_t i; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
240 pool = pool_alloconly_create("header filter stream", 1024); |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 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
|
242 mstream->pool = pool; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
243 |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 mstream->input = input; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 i_stream_ref(mstream->input); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
247 mstream->headers = p_new(pool, const char *, headers_count); |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
248 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
|
249 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
|
250 mstream->headers_count = headers_count; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
251 mstream->hdr_buf = buffer_create_dynamic(pool, 512, (size_t)-1); |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
2429
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
253 mstream->callback = callback; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
254 mstream->context = context; |
92f92b3c447b
istream-header-filter now parses the headers incrementally while read()ing,
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
255 mstream->filter = filter; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 mstream->istream.iostream.close = _close; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 mstream->istream.iostream.destroy = _destroy; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 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
|
260 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 mstream->istream.read = _read; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 mstream->istream.seek = _seek; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 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
|
265 } |