📄 util_filter.h
字号:
/* Copyright 2000-2005 The Apache Software Foundation or its licensors, as * applicable. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */#ifndef AP_FILTER_H#define AP_FILTER_H#include "apr.h"#include "apr_buckets.h"#include "httpd.h"#if APR_HAVE_STDARG_H#include <stdarg.h>#endif#ifdef __cplusplusextern "C" {#endif/** * @file util_filter.h * @brief Apache filter library *//** Returned by the bottom-most filter if no data was written. * @see ap_pass_brigade(). */#define AP_NOBODY_WROTE -1/** Returned by the bottom-most filter if no data was read. * @see ap_get_brigade(). */#define AP_NOBODY_READ -2/** Returned when?? @bug find out when! */#define AP_FILTER_ERROR -3/** * input filtering modes */typedef enum { /** The filter should return at most readbytes data. */ AP_MODE_READBYTES, /** The filter should return at most one line of CRLF data. * (If a potential line is too long or no CRLF is found, the * filter may return partial data). */ AP_MODE_GETLINE, /** The filter should implicitly eat any CRLF pairs that it sees. */ AP_MODE_EATCRLF, /** The filter read should be treated as speculative and any returned * data should be stored for later retrieval in another mode. */ AP_MODE_SPECULATIVE, /** The filter read should be exhaustive and read until it can not * read any more. * Use this mode with extreme caution. */ AP_MODE_EXHAUSTIVE, /** The filter should initialize the connection if needed, * NNTP or FTP over SSL for example. */ AP_MODE_INIT} ap_input_mode_t;/** * @defgroup filter FILTER CHAIN * * Filters operate using a "chaining" mechanism. The filters are chained * together into a sequence. When output is generated, it is passed through * each of the filters on this chain, until it reaches the end (or "bottom") * and is placed onto the network. * * The top of the chain, the code generating the output, is typically called * a "content generator." The content generator's output is fed into the * filter chain using the standard Apache output mechanisms: ap_rputs(), * ap_rprintf(), ap_rwrite(), etc. * * Each filter is defined by a callback. This callback takes the output from * the previous filter (or the content generator if there is no previous * filter), operates on it, and passes the result to the next filter in the * chain. This pass-off is performed using the ap_fc_* functions, such as * ap_fc_puts(), ap_fc_printf(), ap_fc_write(), etc. * * When content generation is complete, the system will pass an "end of * stream" marker into the filter chain. The filters will use this to flush * out any internal state and to detect incomplete syntax (for example, an * unterminated SSI directive). *//* forward declare the filter type */typedef struct ap_filter_t ap_filter_t;/** * @name Filter callbacks * * This function type is used for filter callbacks. It will be passed a * pointer to "this" filter, and a "bucket" containing the content to be * filtered. * * In filter->ctx, the callback will find its context. This context is * provided here, so that a filter may be installed multiple times, each * receiving its own per-install context pointer. * * Callbacks are associated with a filter definition, which is specified * by name. See ap_register_input_filter() and ap_register_output_filter() * for setting the association between a name for a filter and its * associated callback (and other information). * * If the initialization function argument passed to the registration * functions is non-NULL, it will be called iff the filter is in the input * or output filter chains and before any data is generated to allow the * filter to prepare for processing. * * The *bucket structure (and all those referenced by ->next and ->prev) * should be considered "const". The filter is allowed to modify the * next/prev to insert/remove/replace elements in the bucket list, but * the types and values of the individual buckets should not be altered. * * For the input and output filters, the return value of a filter should be * an APR status value. For the init function, the return value should * be an HTTP error code or OK if it was successful. * * @ingroup filter * @{ */typedef apr_status_t (*ap_out_filter_func)(ap_filter_t *f, apr_bucket_brigade *b);typedef apr_status_t (*ap_in_filter_func)(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes);typedef int (*ap_init_filter_func)(ap_filter_t *f);typedef union ap_filter_func { ap_out_filter_func out_func; ap_in_filter_func in_func;} ap_filter_func;/** @} *//** * Filters have different types/classifications. These are used to group * and sort the filters to properly sequence their operation. * * The types have a particular sort order, which allows us to insert them * into the filter chain in a determistic order. Within a particular grouping, * the ordering is equivalent to the order of calls to ap_add_*_filter(). */typedef enum { /** These filters are used to alter the content that is passed through * them. Examples are SSI or PHP. */ AP_FTYPE_RESOURCE = 10, /** These filters are used to alter the content as a whole, but after all * AP_FTYPE_RESOURCE filters are executed. These filters should not * change the content-type. An example is deflate. */ AP_FTYPE_CONTENT_SET = 20, /** These filters are used to handle the protocol between server and * client. Examples are HTTP and POP. */ AP_FTYPE_PROTOCOL = 30, /** These filters implement transport encodings (e.g., chunking). */ AP_FTYPE_TRANSCODE = 40, /** These filters will alter the content, but in ways that are * more strongly associated with the connection. Examples are * splitting an HTTP connection into multiple requests and * buffering HTTP responses across multiple requests. * * It is important to note that these types of filters are not * allowed in a sub-request. A sub-request's output can certainly * be filtered by ::AP_FTYPE_RESOURCE filters, but all of the "final * processing" is determined by the main request. */ AP_FTYPE_CONNECTION = 50, /** These filters don't alter the content. They are responsible for * sending/receiving data to/from the client. */ AP_FTYPE_NETWORK = 60} ap_filter_type;/** * This is the request-time context structure for an installed filter (in * the output filter chain). It provides the callback to use for filtering, * the request this filter is associated with (which is important when * an output chain also includes sub-request filters), the context for this * installed filter, and the filter ordering/chaining fields. * * Filter callbacks are free to use ->ctx as they please, to store context * during the filter process. Generally, this is superior over associating * the state directly with the request. A callback should not change any of * the other fields. */typedef struct ap_filter_rec_t ap_filter_rec_t;/** * This structure is used for recording information about the * registered filters. It associates a name with the filter's callback * and filter type. * * At the moment, these are simply linked in a chain, so a ->next pointer * is available. */struct ap_filter_rec_t { /** The registered name for this filter */ const char *name; /** The function to call when this filter is invoked. */ ap_filter_func filter_func; /** The function to call before the handlers are invoked. Notice * that this function is called only for filters participating in * the http protocol. Filters for other protocols are to be * initiliazed by the protocols themselves. */ ap_init_filter_func filter_init_func; /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION. * An AP_FTYPE_CONTENT filter modifies the data based on information * found in the content. An AP_FTYPE_CONNECTION filter modifies the * data based on the type of connection. */ ap_filter_type ftype; /** The next filter_rec in the list */ struct ap_filter_rec_t *next;};/** * The representation of a filter chain. Each request has a list * of these structures which are called in turn to filter the data. Sub * requests get an exact copy of the main requests filter chain. */struct ap_filter_t { /** The internal representation of this filter. This includes * the filter's name, type, and the actual function pointer. */ ap_filter_rec_t *frec; /** A place to store any data associated with the current filter */ void *ctx; /** The next filter in the chain */ ap_filter_t *next; /** The request_rec associated with the current filter. If a sub-request * adds filters, then the sub-request is the request associated with the * filter. */ request_rec *r; /** The conn_rec associated with the current filter. This is analogous * to the request_rec, except that it is used for input filtering. */ conn_rec *c;};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -