]> granicus.if.org Git - apache/blob - include/util_filter.h
*) namespace protect the filter_flush() function
[apache] / include / util_filter.h
1 /* ====================================================================
2  * The Apache Software License, Version 1.1
3  *
4  * Copyright (c) 2000 The Apache Software Foundation.  All rights
5  * reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  *
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  *
19  * 3. The end-user documentation included with the redistribution,
20  *    if any, must include the following acknowledgment:
21  *       "This product includes software developed by the
22  *        Apache Software Foundation (http://www.apache.org/)."
23  *    Alternately, this acknowledgment may appear in the software itself,
24  *    if and wherever such third-party acknowledgments normally appear.
25  *
26  * 4. The names "Apache" and "Apache Software Foundation" must
27  *    not be used to endorse or promote products derived from this
28  *    software without prior written permission. For written
29  *    permission, please contact apache@apache.org.
30  *
31  * 5. Products derived from this software may not be called "Apache",
32  *    nor may "Apache" appear in their name, without prior written
33  *    permission of the Apache Software Foundation.
34  *
35  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
36  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
38  * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
39  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
40  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
42  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
43  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
45  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46  * SUCH DAMAGE.
47  * ====================================================================
48  *
49  * This software consists of voluntary contributions made by many
50  * individuals on behalf of the Apache Software Foundation.  For more
51  * information on the Apache Software Foundation, please see
52  * <http://www.apache.org/>.
53  */
54
55 #ifndef AP_FILTER_H
56 #define AP_FILTER_H
57
58 #ifdef __cplusplus
59 extern "C" {
60 #endif
61
62 #ifdef APR_HAVE_STDARG_H
63 #include <stdarg.h>
64 #endif
65
66 #include "httpd.h"
67 #include "apr.h"
68 #include "apr_buckets.h"
69
70 /**
71  * @package Apache filter library
72  */
73
74 #define AP_NOBODY_WROTE         -1
75 #define AP_NOBODY_READ          -2
76 #define AP_FILTER_ERROR         -3
77
78 /**
79  * @heading ap_input_mode_t - input filtering modes 
80  * 
81  * AP_MODE_BLOCKING
82  *
83  *   The filter shouldn't return until data is received or EOF is hit
84  *   or an error occurs.
85  *
86  * AP_MODE_NONBLOCKING
87  *
88  *   The filter should process any available data/status as normal,
89  *   but will not wait for additional data.
90  *
91  * AP_MODE_PEEK
92  *
93  *   The filter should return APR_SUCCESS if data is available or
94  *   APR_EOF otherwise.  The filter must not return any buckets of
95  *   data.  Data returned on a subsequent call, when mode is
96  *   AP_MODE_BLOCKING or AP_MODE_NONBLOCKING.
97  */
98 typedef enum {
99     AP_MODE_BLOCKING,
100     AP_MODE_NONBLOCKING,
101     AP_MODE_PEEK
102 } ap_input_mode_t;
103
104 /*
105  * FILTER CHAIN
106  *
107  * Filters operate using a "chaining" mechanism. The filters are chained
108  * together into a sequence. When output is generated, it is passed through
109  * each of the filters on this chain, until it reaches the end (or "bottom")
110  * and is placed onto the network.
111  *
112  * The top of the chain, the code generating the output, is typically called
113  * a "content generator." The content generator's output is fed into the
114  * filter chain using the standard Apache output mechanisms: ap_rputs(),
115  * ap_rprintf(), ap_rwrite(), etc.
116  *
117  * Each filter is defined by a callback. This callback takes the output from
118  * the previous filter (or the content generator if there is no previous
119  * filter), operates on it, and passes the result to the next filter in the
120  * chain. This pass-off is performed using the ap_fc_* functions, such as
121  * ap_fc_puts(), ap_fc_printf(), ap_fc_write(), etc.
122  *
123  * When content generation is complete, the system will pass an "end of
124  * stream" marker into the filter chain. The filters will use this to flush
125  * out any internal state and to detect incomplete syntax (for example, an
126  * unterminated SSI directive).
127  */
128
129 /* forward declare the filter type */
130 typedef struct ap_filter_t ap_filter_t;
131
132 /*
133  * ap_filter_func:
134  *
135  * This function type is used for filter callbacks. It will be passed a
136  * pointer to "this" filter, and a "bucket" containing the content to be
137  * filtered.
138  *
139  * In filter->ctx, the callback will find its context. This context is
140  * provided here, so that a filter may be installed multiple times, each
141  * receiving its own per-install context pointer.
142  *
143  * Callbacks are associated with a filter definition, which is specified
144  * by name. See ap_register_input_filter() and ap_register_output_filter()
145  * for setting the association between a name for a filter and its 
146  * associated callback (and other information).
147  *
148  * The *bucket structure (and all those referenced by ->next and ->prev)
149  * should be considered "const". The filter is allowed to modify the
150  * next/prev to insert/remove/replace elements in the bucket list, but
151  * the types and values of the individual buckets should not be altered.
152  *
153  * The return value of a filter should be an APR status value.
154  */
155 typedef apr_status_t (*ap_out_filter_func)(ap_filter_t *f, apr_bucket_brigade *b);
156 typedef apr_status_t (*ap_in_filter_func)(ap_filter_t *f, apr_bucket_brigade *b, 
157                                           ap_input_mode_t mode);
158 typedef union ap_filter_func {
159     ap_out_filter_func out_func;
160     ap_in_filter_func in_func;
161 } ap_filter_func;
162
163 /**
164  * @heading Filter Types
165  *
166  * ap_filter_type:
167  *
168  * Filters have different types/classifications. These are used to group
169  * and sort the filters to properly sequence their operation.
170  *
171  * AP_FTYPE_CONTENT:
172  *     These filters are used to alter the content that is passed through
173  *     them. Examples are SSI or PHP.
174  *
175  * AP_FTYPE_HTTP_HEADER: (XXX somebody rename me or get rid of me please)
176  *     This special type ensures that the HTTP header filter ends up in
177  *     the proper location in the filter chain.
178  *
179  * AP_FTYPE_TRANSCODE:
180  *     These filters implement transport encodings (e.g., chunking).
181  *
182  * AP_FTYPE_CONNECTION:
183  *     These filters will alter the content, but in ways that are more
184  *     strongly associated with the connection.  Examples are splitting
185  *     an HTTP connection into multiple requests and buffering HTTP
186  *     responses across multiple requests.
187  *
188  *     It is important to note that these types of filters are not allowed
189  *     in a sub-request. A sub-request's output can certainly be filtered
190  *     by AP_FTYPE_CONTENT filters, but all of the "final processing" is
191  *     determined by the main request.
192  *
193  * AP_FTYPE_NETWORK:
194  *     These filters don't alter the content.  They are responsible for
195  *     sending/receiving data to/from the client.
196  *
197  * The types have a particular sort order, which allows us to insert them
198  * into the filter chain in a determistic order. Within a particular grouping,
199  * the ordering is equivalent to the order of calls to ap_add_*_filter().
200  */
201 typedef enum {
202     AP_FTYPE_CONTENT     = 10,
203     AP_FTYPE_HTTP_HEADER = 20,
204     AP_FTYPE_TRANSCODE   = 30,
205     AP_FTYPE_CONNECTION  = 40,
206     AP_FTYPE_NETWORK     = 50
207 } ap_filter_type;
208
209 /*
210  * ap_filter_t:
211  *
212  * This is the request-time context structure for an installed filter (in
213  * the output filter chain). It provides the callback to use for filtering,
214  * the request this filter is associated with (which is important when
215  * an output chain also includes sub-request filters), the context for this
216  * installed filter, and the filter ordering/chaining fields.
217  *
218  * Filter callbacks are free to use ->ctx as they please, to store context
219  * during the filter process. Generally, this is superior over associating
220  * the state directly with the request. A callback should not change any of
221  * the other fields.
222  */
223
224 typedef struct ap_filter_rec_t ap_filter_rec_t;
225
226 /**
227  * This structure is used for recording information about the
228  * registered filters. It associates a name with the filter's callback
229  * and filter type.
230  *
231  * At the moment, these are simply linked in a chain, so a ->next pointer
232  * is available.
233  */
234 struct ap_filter_rec_t {
235     /** The registered name for this filter */
236     const char *name;
237     /** The function to call when this filter is invoked. */
238     ap_filter_func filter_func;
239     /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION.  
240      * An AP_FTYPE_CONTENT filter modifies the data based on information 
241      * found in the content.  An AP_FTYPE_CONNECTION filter modifies the 
242      * data based on the type of connection.
243      */
244     ap_filter_type ftype;
245
246     /** The next filter_rec in the list */
247     struct ap_filter_rec_t *next;
248 };
249
250 /**
251  * The representation of a filter chain.  Each request has a list
252  * of these structures which are called in turn to filter the data.  Sub
253  * requests get an exact copy of the main requests filter chain.
254  */
255 struct ap_filter_t {
256      /** The internal representation of this filter.  This includes
257       *  the filter's name, type, and the actual function pointer.
258      */
259     ap_filter_rec_t *frec;
260
261     /** A place to store any data associated with the current filter */
262     void *ctx;
263
264     /** The next filter in the chain */
265     ap_filter_t *next;
266
267     /** The request_rec associated with the current filter.  If a sub-request
268      *  adds filters, then the sub-request is the request associated with the
269      *  filter.
270      */
271     request_rec *r;
272
273     /** The conn_rec associated with the current filter.  This is analogous
274      *  to the request_rec, except that it is used for input filtering.
275      */
276     conn_rec *c;
277 };
278
279 /**
280  * Get the current bucket brigade from the next filter on the filter
281  * stack.  The filter should return an apr_status_t value.  If the bottom-most 
282  * filter doesn't write to the network, then AP_NOBODY_READ is returned.
283  * @param filter The next filter in the chain
284  * @param bucket The current bucket brigade
285  * @param mode   AP_MODE_BLOCKING, AP_MODE_NONBLOCKING, or AP_MODE_PEEK
286  * @return apr_status_t value
287  * @deffunc apr_status_t ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, ap_input_mode_t mode)
288  */
289 AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, 
290                                         ap_input_mode_t mode);
291
292 /**
293  * Pass the current bucket brigade down to the next filter on the filter
294  * stack.  The filter should return an apr_status_t value.  If the bottom-most 
295  * filter doesn't write to the network, then AP_NOBODY_WROTE is returned.
296  * @param filter The next filter in the chain
297  * @param bucket The current bucket brigade
298  * @return apr_status_t value
299  * @deffunc apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
300  */
301 AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket);
302
303 /**
304  * This function is used to register an input filter with the system. 
305  * After this registration is performed, then a filter may be added 
306  * into the filter chain by using ap_add_input_filter() and simply 
307  * specifying the name.
308  *
309  * @param name The name to attach to the filter function
310  * @param filter_func The filter function to name
311  * @param ftype The type of filter function, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION
312  */
313 AP_DECLARE(void) ap_register_input_filter(const char *name,
314                                           ap_in_filter_func filter_func,
315                                           ap_filter_type ftype);
316 /**
317  * This function is used to register an output filter with the system. 
318  * After this registration is performed, then a filter may be added 
319  * into the filter chain by using ap_add_output_filter() and simply 
320  * specifying the name.
321  *
322  * @param name The name to attach to the filter function
323  * @param filter_func The filter function to name
324  * @param ftype The type of filter function, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION
325  * @see ::ap_add_output_filter
326  */
327 AP_DECLARE(void) ap_register_output_filter(const char *name,
328                                            ap_out_filter_func filter_func,
329                                            ap_filter_type ftype);
330
331 /*
332  * ap_add_filter():
333  *
334  * Adds a named filter into the filter chain on the specified request record.
335  * The filter will be installed with the specified context pointer.
336  *
337  * Filters added in this way will always be placed at the end of the filters
338  * that have the same type (thus, the filters have the same order as the
339  * calls to ap_add_filter). If the current filter chain contains filters
340  * from another request, then this filter will be added before those other
341  * filters.
342  * 
343  * To re-iterate that last comment.  This function is building a FIFO
344  * list of filters.  Take note of that when adding your filter to the chain.
345  */
346 /**
347  * Add a filter to the current connection.  Filters are added in a FIFO manner.
348  * The first filter added will be the first filter called.
349  * @param name The name of the filter to add
350  * @param r The request to add this filter for (or NULL if it isn't associated with a request)
351  * @param c The connection to add the fillter for
352  * @deffunc void ap_add_input_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
353  */
354 AP_DECLARE(void) ap_add_input_filter(const char *name, void *ctx, request_rec *r, conn_rec *c);
355
356 /**
357  * Add a filter to the current request.  Filters are added in a FIFO manner.
358  * The first filter added will be the first filter called.
359  * @param name The name of the filter to add
360  * @param ctx Context data to set in the filter
361  * @param r The request to add this filter for (or NULL if it isn't associated with a request)
362  * @param c The connection to add this filter for
363  * @deffunc void ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
364  */
365 AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx, 
366                                       request_rec *r, conn_rec *c);
367
368 AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f);
369
370 /* The next two filters are for abstraction purposes only.  They could be
371  * done away with, but that would require that we break modules if we ever
372  * want to change our filter registration method.  The basic idea, is that
373  * all filters have a place to store data, the ctx pointer.  These functions
374  * fill out that pointer with a bucket brigade, and retrieve that data on
375  * the next call.  The nice thing about these functions, is that they
376  * automatically concatenate the bucket brigades together for you.  This means
377  * that if you have already stored a brigade in the filters ctx pointer, then
378  * when you add more it will be tacked onto the end of that brigade.  When
379  * you retrieve data, if you pass in a bucket brigade to the get function,
380  * it will append the current brigade onto the one that you are retrieving.
381  */
382
383 /**
384  * prepare a bucket brigade to be setaside.  If a different brigade was 
385  * set-aside earlier, then the two brigades are concatenated together.
386  * @param f The current filter
387  * @param save_to The brigade that was previously set-aside.  Regardless, the
388  *             new bucket brigade is returned in this location.
389  * @param b The bucket brigade to save aside.  This brigade is always empty
390  *          on return
391  * @deffunc apr_status_t ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **save_to, apr_bucket_brigade **b)
392  */
393 AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **save_to,
394                                          apr_bucket_brigade **b);    
395
396 /**
397  * Flush function for apr_brigade_* calls.  This calls ap_pass_brigade
398  * to flush the brigade if the brigade buffer overflows.
399  * @param bb The brigade to flush
400  * @param ctx The filter to pass the brigade to
401  * @deffunc apr_status_t ap_filter_flush(apr_bucket_brigade *bb, void *ctx)
402  */
403 AP_DECLARE(apr_status_t) ap_filter_flush(apr_bucket_brigade *bb, void *ctx);
404
405 /**
406  * Flush the current brigade down the filter stack
407  * @param f the next filter in the stack
408  * @param bb The brigade to flush
409  * @deffunc apr_status_t ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb)
410  */
411 AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb);
412
413 /**
414  * Write a buffer for the current filter, buffering if possible.
415  * @param f the filter doing the writing
416  * @param bb The brigade to buffer into
417  * @param data The data to write
418  * @param nbyte The number of bytes in the data
419  * @deffunc int ap_fwrite(ap_filter_t *f, apr_bucket_brigade *bb, const char *data, apr_ssize_t nbyte);
420  */
421 #define ap_fwrite(f, bb, data, nbyte) \
422         apr_brigade_write(bb, ap_filter_flush, (f)->next, data, nbyte)
423
424 /**
425  * Write a buffer for the current filter, buffering if possible.
426  * @param f the filter doing the writing
427  * @param bb The brigade to buffer into
428  * @param str The string to write
429  * @deffunc int ap_fputs(ap_filter_t *f, apr_bucket_brigade *bb, const char *str);
430  */
431 #define ap_fputs(f, bb, str) \
432         apr_brigade_puts(bb, ap_filter_flush, (f)->next, str)
433
434 /**
435  * Write a character for the current filter, buffering if possible.
436  * @param f the filter doing the writing
437  * @param bb The brigade to buffer into
438  * @param c The character to write
439  * @deffunc int ap_fputc(ap_filter_t *f, apr_bucket_brigade *bb, char c);
440  */
441 #define ap_fputc(f, bb, c) \
442         apr_brigade_putc(bb, ap_filter_flush, (f)->next, c)
443
444 /**
445  * Write an unspecified number of strings to the current filter
446  * @param f the filter doing the writing
447  * @param bb The brigade to buffer into
448  * @param ... The strings to write
449  * @deffunc int ap_fputs(ap_filter_t *f, apr_bucket_brigade *bb, ...);
450  */
451 #define ap_fvputs(f, bb, args...) \
452         apr_brigade_putstrs(bb, ap_filter_flush, (f)->next, ##args)
453
454 /**
455  * Output data to the filter in printf format
456  * @param f the filter doing the writing
457  * @param bb The brigade to buffer into
458  * @param fmt The format string
459  * @param ... The argumets to use to fill out the format string
460  * @deffunc int ap_fputs(ap_filter_t *f, apr_bucket_brigade *bb, const char *fmt, ...);
461  */
462 #define ap_fprintf(f, bb, fmt, args...) \
463         apr_brigade_printf(bb, ap_filter_flush, (f)->next, fmt, ##args)
464
465 #ifdef __cplusplus
466 }
467 #endif
468
469 #endif  /* !AP_FILTER_H */