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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2196
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2003-2004 Timo Sirainen */
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
0417cdfa6d88 Added istream-header-filter, which allows filtering specified headers from
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 /* 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 }