⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 util_filter.h

📁 Apache HTTP Server 是一个功能强大的灵活的与HTTP/1.1相兼容的web服务器.这里给出的是Apache HTTP服务器的源码。
💻 H
📖 第 1 页 / 共 2 页
字号:
/* 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 + -