]> granicus.if.org Git - apache/blob - include/util_filter.h
Stop the default_handler from trying to deal with HEAD requests. By doing
[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 "ap_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_REQUEST_DONE         -3
77
78 /* ap_input_mode_t - input filtering modes 
79  * 
80  * AP_MODE_BLOCKING
81  *
82  *   The filter shouldn't return until data is received or EOF is hit or an error
83  *   occurs.
84  *
85  * AP_MODE_NONBLOCKING
86  *
87  *   The filter should process any available data/status as normal, but will not 
88  *   wait for additional data.
89  *
90  * AP_MODE_PEEK
91  *
92  *   The filter should return APR_SUCCESS if data is available or APR_EOF 
93  *   otherwise.  The filter must not return any buckets of data.  Data returned
94  *   on a subsequent call, when mode is AP_MODE_BLOCKING or AP_MODE_NONBLOCKING.
95  */
96 typedef enum {
97     AP_MODE_BLOCKING,
98     AP_MODE_NONBLOCKING,
99     AP_MODE_PEEK
100 } ap_input_mode_t;
101
102 /*
103  * FILTER CHAIN
104  *
105  * Filters operate using a "chaining" mechanism. The filters are chained
106  * together into a sequence. When output is generated, it is passed through
107  * each of the filters on this chain, until it reaches the end (or "bottom")
108  * and is placed onto the network.
109  *
110  * The top of the chain, the code generating the output, is typically called
111  * a "content generator." The content generator's output is fed into the
112  * filter chain using the standard Apache output mechanisms: ap_rputs(),
113  * ap_rprintf(), ap_rwrite(), etc.
114  *
115  * Each filter is defined by a callback. This callback takes the output from
116  * the previous filter (or the content generator if there is no previous
117  * filter), operates on it, and passes the result to the next filter in the
118  * chain. This pass-off is performed using the ap_fc_* functions, such as
119  * ap_fc_puts(), ap_fc_printf(), ap_fc_write(), etc.
120  *
121  * When content generation is complete, the system will pass an "end of
122  * stream" marker into the filter chain. The filters will use this to flush
123  * out any internal state and to detect incomplete syntax (for example, an
124  * unterminated SSI directive).
125  */
126
127 /* forward declare the filter type */
128 typedef struct ap_filter_t ap_filter_t;
129
130 /*
131  * ap_filter_func:
132  *
133  * This function type is used for filter callbacks. It will be passed a
134  * pointer to "this" filter, and a "bucket" containing the content to be
135  * filtered.
136  *
137  * In filter->ctx, the callback will find its context. This context is
138  * provided here, so that a filter may be installed multiple times, each
139  * receiving its own per-install context pointer.
140  *
141  * Callbacks are associated with a filter definition, which is specified
142  * by name. See ap_register_input_filter() and ap_register_output_filter()
143  * for setting the association between a name for a filter and its 
144  * associated callback (and other information).
145  *
146  * The *bucket structure (and all those referenced by ->next and ->prev)
147  * should be considered "const". The filter is allowed to modify the
148  * next/prev to insert/remove/replace elements in the bucket list, but
149  * the types and values of the individual buckets should not be altered.
150  *
151  * The return value of a filter should be an APR status value.
152  */
153 typedef apr_status_t (*ap_out_filter_func)(ap_filter_t *f, ap_bucket_brigade *b);
154 typedef apr_status_t (*ap_in_filter_func)(ap_filter_t *f, ap_bucket_brigade *b, 
155                                           ap_input_mode_t mode);
156 typedef union ap_filter_func {
157     ap_out_filter_func out_func;
158     ap_in_filter_func in_func;
159 } ap_filter_func;
160
161 /*
162  * ap_filter_type:
163  *
164  * Filters have different types/classifications. These are used to group
165  * and sort the filters to properly sequence their operation.
166  *
167  * AP_FTYPE_CONTENT:
168  *     These filters are used to alter the content that is passed through
169  *     them. Examples are SSI or PHP.
170  *
171  * AP_FTYPE_HTTP_HEADER: (XXX somebody rename me or get rid of me please)
172  *     This special type ensures that the HTTP header filter ends up in
173  *     the proper location in the filter chain.
174  *
175  * AP_FTYPE_TRANSCODE:
176  *     These filters implement transport encodings (e.g., chunking).
177  *
178  * AP_FTYPE_CONNECTION:
179  *     These filters will alter the content, but in ways that are more
180  *     strongly associated with the connection.  Examples are splitting
181  *     an HTTP connection into multiple requests and buffering HTTP
182  *     responses across multiple requests.
183  *
184  *     It is important to note that these types of filters are not allowed
185  *     in a sub-request. A sub-request's output can certainly be filtered
186  *     by AP_FTYPE_CONTENT filters, but all of the "final processing" is
187  *     determined by the main request.
188  *
189  * AP_FTYPE_NETWORK:
190  *     These filters don't alter the content.  They are responsible for
191  *     sending/receiving data to/from the client.
192  *
193  * The types have a particular sort order, which allows us to insert them
194  * into the filter chain in a determistic order. Within a particular grouping,
195  * the ordering is equivalent to the order of calls to ap_add_*_filter().
196  */
197 typedef enum {
198     AP_FTYPE_CONTENT     = 10,
199     AP_FTYPE_HTTP_HEADER = 20,
200     AP_FTYPE_TRANSCODE   = 30,
201     AP_FTYPE_CONNECTION  = 40,
202     AP_FTYPE_NETWORK     = 50
203 } ap_filter_type;
204
205 /*
206  * ap_filter_t:
207  *
208  * This is the request-time context structure for an installed filter (in
209  * the output filter chain). It provides the callback to use for filtering,
210  * the request this filter is associated with (which is important when
211  * an output chain also includes sub-request filters), the context for this
212  * installed filter, and the filter ordering/chaining fields.
213  *
214  * Filter callbacks are free to use ->ctx as they please, to store context
215  * during the filter process. Generally, this is superior over associating
216  * the state directly with the request. A callback should not change any of
217  * the other fields.
218  */
219
220 typedef struct ap_filter_rec_t ap_filter_rec_t;
221
222 /**
223  * This structure is used for recording information about the
224  * registered filters. It associates a name with the filter's callback
225  * and filter type.
226  *
227  * At the moment, these are simply linked in a chain, so a ->next pointer
228  * is available.
229  */
230 struct ap_filter_rec_t {
231     /** The registered name for this filter */
232     const char *name;
233     /** The function to call when this filter is invoked. */
234     ap_filter_func filter_func;
235     /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION.  
236      * An AP_FTYPE_CONTENT filter modifies the data based on information 
237      * found in the content.  An AP_FTYPE_CONNECTION filter modifies the 
238      * data based on the type of connection.
239      */
240     ap_filter_type ftype;
241
242     /** The next filter_rec in the list */
243     struct ap_filter_rec_t *next;
244 };
245
246 /**
247  * The representation of a filter chain.  Each request has a list
248  * of these structures which are called in turn to filter the data.  Sub
249  * requests get an exact copy of the main requests filter chain.
250  */
251 struct ap_filter_t {
252      /** The internal representation of this filter.  This includes
253       *  the filter's name, type, and the actual function pointer.
254      */
255     ap_filter_rec_t *frec;
256
257     /** A place to store any data associated with the current filter */
258     void *ctx;
259
260     /** The next filter in the chain */
261     ap_filter_t *next;
262
263     /** The request_rec associated with the current filter.  If a sub-request
264      *  adds filters, then the sub-request is the request associated with the
265      *  filter.
266      */
267     request_rec *r;
268
269     /** The conn_rec associated with the current filter.  This is analogous
270      *  to the request_rec, except that it is used for input filtering.
271      */
272     conn_rec *c;
273 };
274
275 /**
276  * Get the current bucket brigade from the next filter on the filter
277  * stack.  The filter should return an apr_status_t value.  If the bottom-most 
278  * filter doesn't write to the network, then AP_NOBODY_READ is returned.
279  * @param filter The next filter in the chain
280  * @param bucket The current bucket brigade
281  * @param mode   AP_MODE_BLOCKING, AP_MODE_NONBLOCKING, or AP_MODE_PEEK
282  * @return apr_status_t value
283  * @deffunc apr_status_t ap_get_brigade(ap_filter_t *filter, ap_bucket_brigade *bucket, ap_input_mode_t mode)
284  */
285 AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter, ap_bucket_brigade *bucket, 
286                                         ap_input_mode_t mode);
287
288 /**
289  * Pass the current bucket brigade down to the next filter on the filter
290  * stack.  The filter should return an apr_status_t value.  If the bottom-most 
291  * filter doesn't write to the network, then AP_NOBODY_WROTE is returned.
292  * @param filter The next filter in the chain
293  * @param bucket The current bucket brigade
294  * @return apr_status_t value
295  * @deffunc apr_status_t ap_pass_brigade(ap_filter_t *filter, ap_bucket_brigade *bucket)
296  */
297 AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter, ap_bucket_brigade *bucket);
298
299 /*
300  * ap_register_input_filter():
301  *
302  * This function is used to register an input filter with the system. 
303  * After this registration is performed, then a filter may be added 
304  * into the filter chain by using ap_add_input_filter() and simply 
305  * specifying the name.
306  *
307  * The filter's callback and type should be passed.
308  */
309 /**
310  * Register an input filter for later use.  This allows modules to name their 
311  * filter functions for later addition to a specific request
312  * @param name The name to attach to the filter function
313  * @param filter_func The filter function to name
314  * @param The type of filter function, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION
315  * @deffunc void ap_register_input_filter(const char *name, ap_in_filter_func filter_func, ap_filter_type ftype)
316  */
317 AP_DECLARE(void) ap_register_input_filter(const char *name,
318                                           ap_in_filter_func filter_func,
319                                           ap_filter_type ftype);
320 /*
321  * ap_register_output_filter():
322  *
323  * This function is used to register an output filter with the system. 
324  * After this registration is performed, then a filter may be added 
325  * into the filter chain by using ap_add_output_filter() and simply 
326  * specifying the name.
327  *
328  * The filter's callback and type should be passed.
329  */
330 /**
331  * Register an output filter for later use.  This allows modules to name their 
332  * filter functions for later addition to a specific request
333  * @param name The name to attach to the filter function
334  * @param filter_func The filter function to name
335  * @param The type of filter function, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION
336  * @deffunc void ap_register_output_filter(const char *name, ap_out_filter_func filter_func, ap_filter_type ftype)
337  */
338 AP_DECLARE(void) ap_register_output_filter(const char *name,
339                                            ap_out_filter_func filter_func,
340                                            ap_filter_type ftype);
341
342 /*
343  * ap_add_filter():
344  *
345  * Adds a named filter into the filter chain on the specified request record.
346  * The filter will be installed with the specified context pointer.
347  *
348  * Filters added in this way will always be placed at the end of the filters
349  * that have the same type (thus, the filters have the same order as the
350  * calls to ap_add_filter). If the current filter chain contains filters
351  * from another request, then this filter will be added before those other
352  * filters.
353  * 
354  * To re-iterate that last comment.  This function is building a FIFO
355  * list of filters.  Take note of that when adding your filter to the chain.
356  */
357 /**
358  * Add a filter to the current connection.  Filters are added in a FIFO manner.
359  * The first filter added will be the first filter called.
360  * @param name The name of the filter to add
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 the fillter for
363  * @deffunc void ap_add_input_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
364  */
365 AP_DECLARE(void) ap_add_input_filter(const char *name, void *ctx, request_rec *r, conn_rec *c);
366
367 /**
368  * Add a filter to the current request.  Filters are added in a FIFO manner.
369  * The first filter added will be the first filter called.
370  * @param name The name of the filter to add
371  * @param ctx Context data to set in the filter
372  * @param r The request to add this filter for (or NULL if it isn't associated with a request)
373  * @param c The connection to add this filter for
374  * @deffunc void ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
375  */
376 AP_DECLARE(void) ap_add_output_filter(const char *name, void *ctx, 
377                                       request_rec *r, conn_rec *c);
378
379 AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f);
380
381 /* The next two filters are for abstraction purposes only.  They could be
382  * done away with, but that would require that we break modules if we ever
383  * want to change our filter registration method.  The basic idea, is that
384  * all filters have a place to store data, the ctx pointer.  These functions
385  * fill out that pointer with a bucket brigade, and retrieve that data on
386  * the next call.  The nice thing about these functions, is that they
387  * automatically concatenate the bucket brigades together for you.  This means
388  * that if you have already stored a brigade in the filters ctx pointer, then
389  * when you add more it will be tacked onto the end of that brigade.  When
390  * you retrieve data, if you pass in a bucket brigade to the get function,
391  * it will append the current brigade onto the one that you are retrieving.
392  */
393
394 /**
395  * prepare a bucket brigade to be setaside.  If a different brigade was 
396  * set-aside earlier, then the two brigades are concatenated together.
397  * @param f The current filter
398  * @param save_to The brigade that was previously set-aside.  Regardless, the
399  *             new bucket brigade is returned in this location.
400  * @param b The bucket brigade to save aside.  This brigade is always empty
401  *          on return
402  * @deffunc void ap_save_brigade(ap_filter_t *f, ap_bucket_brigade **save_to, ap_bucket_brigade **b)
403  */
404 AP_DECLARE(void) ap_save_brigade(ap_filter_t *f, ap_bucket_brigade **save_to,
405                                         ap_bucket_brigade **b);    
406
407 #ifdef __cplusplus
408 }
409 #endif
410
411 #endif  /* !AP_FILTER_H */