Mercurial > dovecot > core-2.2
annotate src/lib-mail/istream-header-filter.c @ 2295:545c1d3ead54 HEAD
Wrapper streams shouldn't try to read data if it's already buffered in main
stream. Fixes at least problem with APPEND when the whole message came in
one TCP packet.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 07 Jul 2004 16:36:29 +0300 |
parents | 0417cdfa6d88 |
children | 7d02e2a7672d |
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 /* FIXME: the header wouldn't necessarily have to be read in memory. we could |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 just parse it forward in _read(). */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "lib.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "buffer.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "message-parser.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "istream-internal.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "istream-header-filter.h" |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <stdlib.h> |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 struct header_filter_istream { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 struct _istream istream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct istream *input; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 buffer_t *headers; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct message_size header_size; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 }; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 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
|
24 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 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
|
28 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 i_stream_unref(mstream->input); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 buffer_free(mstream->headers); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 static void _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
|
37 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 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
|
42 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 static void _set_blocking(struct _iostream *stream, int timeout_msecs, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 void (*timeout_cb)(void *), void *context) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 i_stream_set_blocking(mstream->input, timeout_msecs, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 timeout_cb, context); |
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 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 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
|
55 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 ssize_t ret; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 size_t pos; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 if (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
|
62 /* we don't support mixing headers and body. |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 it shouldn't be needed. */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 return -2; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 mstream->header_size.virtual_size + |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 mstream->header_size.physical_size); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 } |
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
|
80 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
|
81 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
|
82 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
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
|
84 stream->pos -= mstream->istream.skip; |
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
|
85 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
|
86 |
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
|
87 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
|
88 (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
|
89 stream->pos = pos; |
2196
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 return ret; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 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
|
94 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 struct header_filter_istream *mstream = |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 (struct header_filter_istream *)stream; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 stream->istream.v_offset = v_offset; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 if (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
|
100 /* still in headers */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 stream->skip = v_offset; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 stream->pos = mstream->header_size.virtual_size; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 stream->buffer = buffer_get_data(mstream->headers, NULL); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 } else { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 /* body - use our real input stream */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 stream->skip = stream->pos = 0; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 stream->buffer = NULL; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 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
|
110 mstream->header_size.virtual_size; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 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
|
112 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 static void read_and_hide_headers(struct istream *input, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 const char *const *headers, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 size_t headers_count, buffer_t *dest, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 struct message_size *hdr_size) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 struct message_header_parser_ctx *hdr_ctx; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 struct message_header_line *hdr; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 uoff_t virtual_size = 0; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 hdr_ctx = message_parse_header_init(input, hdr_size, FALSE); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 while ((hdr = message_parse_header_next(hdr_ctx)) != NULL) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 if (hdr->eoh) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 if (dest != NULL) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 buffer_append(dest, "\r\n", 2); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 else |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 virtual_size += 2; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 break; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 if (bsearch(hdr->name, headers, headers_count, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 sizeof(*headers), bsearch_strcasecmp) != NULL) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 /* ignore */ |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 } else if (dest != NULL) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if (!hdr->continued) { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 buffer_append(dest, hdr->name, hdr->name_len); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 buffer_append(dest, ": ", 2); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 buffer_append(dest, hdr->value, hdr->value_len); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 buffer_append(dest, "\r\n", 2); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 } else { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 if (!hdr->continued) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 virtual_size += hdr->name_len + 2; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 virtual_size += hdr->value_len + 2; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 message_parse_header_deinit(hdr_ctx); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 if (dest != NULL) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 virtual_size = buffer_get_used_size(dest); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 hdr_size->virtual_size = virtual_size; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 hdr_size->lines = 0; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 } |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 struct istream * |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 i_stream_create_header_filter(pool_t pool, struct istream *input, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 const char *const *headers, size_t headers_count) |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 { |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 struct header_filter_istream *mstream; |
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 mstream = p_new(pool, struct header_filter_istream, 1); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 mstream->input = input; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 i_stream_ref(mstream->input); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 mstream->headers = buffer_create_dynamic(default_pool, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 8192, (size_t)-1); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 read_and_hide_headers(input, headers, headers_count, mstream->headers, |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 &mstream->header_size); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 mstream->istream.buffer = buffer_get_data(mstream->headers, NULL); |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 mstream->istream.pos = mstream->header_size.virtual_size; |
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 mstream->istream.iostream.close = _close; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 mstream->istream.iostream.destroy = _destroy; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 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
|
180 mstream->istream.iostream.set_blocking = _set_blocking; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 mstream->istream.read = _read; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 mstream->istream.seek = _seek; |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 |
0417cdfa6d88
Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 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
|
186 } |