util_filter.h revision 8262e4bc77385e421302dd4d719e1182a910de1d
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/* ====================================================================
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The Apache Software License, Version 1.1
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
b475917ddf898282aa51ce31b3275c2c4783ce98coar * Copyright (c) 2000-2001 The Apache Software Foundation. All rights
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * reserved.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Redistribution and use in source and binary forms, with or without
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * modification, are permitted provided that the following conditions
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * are met:
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * 1. Redistributions of source code must retain the above copyright
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * notice, this list of conditions and the following disclaimer.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * 2. Redistributions in binary form must reproduce the above copyright
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * notice, this list of conditions and the following disclaimer in
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the documentation and/or other materials provided with the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * distribution.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * 3. The end-user documentation included with the redistribution,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * if any, must include the following acknowledgment:
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * "This product includes software developed by the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Apache Software Foundation (http://www.apache.org/)."
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Alternately, this acknowledgment may appear in the software itself,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * if and wherever such third-party acknowledgments normally appear.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * 4. The names "Apache" and "Apache Software Foundation" must
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * not be used to endorse or promote products derived from this
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * software without prior written permission. For written
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * permission, please contact apache@apache.org.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * 5. Products derived from this software may not be called "Apache",
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * nor may "Apache" appear in their name, without prior written
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * permission of the Apache Software Foundation.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * SUCH DAMAGE.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ====================================================================
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This software consists of voluntary contributions made by many
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * individuals on behalf of the Apache Software Foundation. For more
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * information on the Apache Software Foundation, please see
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * <http://www.apache.org/>.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#ifndef AP_FILTER_H
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define AP_FILTER_H
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#include "apr.h"
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#include "apr_buckets.h"
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#include "httpd.h"
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#if APR_HAVE_STDARG_H
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#include <stdarg.h>
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#endif
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#ifdef __cplusplus
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorextern "C" {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#endif
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @file util_filter.h
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @brief Apache filter library
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/** Returned by the bottom-most filter if no data was written.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @see ap_pass_brigade(). */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define AP_NOBODY_WROTE -1
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/** Returned by the bottom-most filter if no data was read.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @see ap_get_brigade(). */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define AP_NOBODY_READ -2
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/** Returned when?? @bug find out when! */
2dda612e9e4715a5deca6a897b50b937d0403f16lgentis#define AP_FILTER_ERROR -3
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * input filtering modes
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef enum {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter should return at most readbytes data. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_READBYTES,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter should return at most one line of CRLF data.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * (If a potential line is too long or no CRLF is found, the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter may return partial data).
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_GETLINE,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter should implicitly eat any CRLF pairs that it sees. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_EATCRLF,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter read should be treated as speculative and any returned
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * data should be stored for later retrieval in another mode. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_SPECULATIVE,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter read should be exhaustive and read until it can not
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * read any more.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Use this mode with extreme caution.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_EXHAUSTIVE,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The filter should initialize the connection if needed,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * NNTP or FTP over SSL for example.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_MODE_INIT
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor} ap_input_mode_t;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @defgroup filter FILTER CHAIN
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Filters operate using a "chaining" mechanism. The filters are chained
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * together into a sequence. When output is generated, it is passed through
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * each of the filters on this chain, until it reaches the end (or "bottom")
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * and is placed onto the network.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The top of the chain, the code generating the output, is typically called
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * a "content generator." The content generator's output is fed into the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter chain using the standard Apache output mechanisms: ap_rputs(),
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ap_rprintf(), ap_rwrite(), etc.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Each filter is defined by a callback. This callback takes the output from
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the previous filter (or the content generator if there is no previous
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter), operates on it, and passes the result to the next filter in the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * chain. This pass-off is performed using the ap_fc_* functions, such as
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ap_fc_puts(), ap_fc_printf(), ap_fc_write(), etc.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * When content generation is complete, the system will pass an "end of
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * stream" marker into the filter chain. The filters will use this to flush
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * out any internal state and to detect incomplete syntax (for example, an
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * unterminated SSI directive).
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/* forward declare the filter type */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef struct ap_filter_t ap_filter_t;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @name Filter callbacks
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This function type is used for filter callbacks. It will be passed a
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * pointer to "this" filter, and a "bucket" containing the content to be
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filtered.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * In filter->ctx, the callback will find its context. This context is
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * provided here, so that a filter may be installed multiple times, each
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * receiving its own per-install context pointer.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Callbacks are associated with a filter definition, which is specified
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * by name. See ap_register_input_filter() and ap_register_output_filter()
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * for setting the association between a name for a filter and its
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * associated callback (and other information).
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The *bucket structure (and all those referenced by ->next and ->prev)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * should be considered "const". The filter is allowed to modify the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * next/prev to insert/remove/replace elements in the bucket list, but
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the types and values of the individual buckets should not be altered.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The return value of a filter should be an APR status value.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @ingroup filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @{
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef apr_status_t (*ap_out_filter_func)(ap_filter_t *f, apr_bucket_brigade *b);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef apr_status_t (*ap_in_filter_func)(ap_filter_t *f, apr_bucket_brigade *b,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef union ap_filter_func {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_out_filter_func out_func;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_in_filter_func in_func;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor} ap_filter_func;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/** @} */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Filters have different types/classifications. These are used to group
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * and sort the filters to properly sequence their operation.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The types have a particular sort order, which allows us to insert them
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * into the filter chain in a determistic order. Within a particular grouping,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the ordering is equivalent to the order of calls to ap_add_*_filter().
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef enum {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters are used to alter the content that is passed through
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * them. Examples are SSI or PHP. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_RESOURCE = 10,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters are used to alter the content as a whole, but after all
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * AP_FTYPE_RESOURCE filters are executed. These filters should not
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * change the content-type. An example is deflate. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_CONTENT_SET = 20,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters are used to handle the protocol between server and
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * client. Examples are HTTP and POP. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_PROTOCOL = 30,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters implement transport encodings (e.g., chunking). */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_TRANSCODE = 40,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters will alter the content, but in ways that are
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * more strongly associated with the connection. Examples are
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * splitting an HTTP connection into multiple requests and
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * buffering HTTP responses across multiple requests.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * It is important to note that these types of filters are not
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * allowed in a sub-request. A sub-request's output can certainly
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * be filtered by ::AP_FTYPE_RESOURCE filters, but all of the "final
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * processing" is determined by the main request. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_CONNECTION = 50,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** These filters don't alter the content. They are responsible for
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * sending/receiving data to/from the client. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor AP_FTYPE_NETWORK = 60
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor} ap_filter_type;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This is the request-time context structure for an installed filter (in
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the output filter chain). It provides the callback to use for filtering,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the request this filter is associated with (which is important when
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * an output chain also includes sub-request filters), the context for this
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * installed filter, and the filter ordering/chaining fields.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Filter callbacks are free to use ->ctx as they please, to store context
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * during the filter process. Generally, this is superior over associating
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the state directly with the request. A callback should not change any of
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the other fields.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzortypedef struct ap_filter_rec_t ap_filter_rec_t;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This structure is used for recording information about the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * registered filters. It associates a name with the filter's callback
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * and filter type.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * At the moment, these are simply linked in a chain, so a ->next pointer
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * is available.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorstruct ap_filter_rec_t {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The registered name for this filter */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor const char *name;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The function to call when this filter is invoked. */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_func filter_func;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * An AP_FTYPE_CONTENT filter modifies the data based on information
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * found in the content. An AP_FTYPE_CONNECTION filter modifies the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * data based on the type of connection.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_type ftype;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The next filter_rec in the list */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor struct ap_filter_rec_t *next;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor};
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The representation of a filter chain. Each request has a list
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * of these structures which are called in turn to filter the data. Sub
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * requests get an exact copy of the main requests filter chain.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorstruct ap_filter_t {
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The internal representation of this filter. This includes
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the filter's name, type, and the actual function pointer.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_rec_t *frec;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** A place to store any data associated with the current filter */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor void *ctx;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The next filter in the chain */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_t *next;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The request_rec associated with the current filter. If a sub-request
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * adds filters, then the sub-request is the request associated with the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor request_rec *r;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor /** The conn_rec associated with the current filter. This is analogous
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * to the request_rec, except that it is used for input filtering.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor conn_rec *c;
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor};
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Get the current bucket brigade from the next filter on the filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * stack. The filter returns an apr_status_t value. If the bottom-most
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter doesn't read from the network, then ::AP_NOBODY_READ is returned.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The bucket brigade will be empty when there is nothing left to get.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param filter The next filter in the chain
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bucket The current bucket brigade
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param mode The way in which the data should be read
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param block How the operations should be performed
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ::APR_BLOCK_READ, ::APR_NONBLOCK_READ
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param readbytes How many bytes to read from the next filter.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_bucket_brigade *bucket,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_input_mode_t mode,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_read_type_e block,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_off_t readbytes);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Pass the current bucket brigade down to the next filter on the filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * stack. The filter returns an apr_status_t value. If the bottom-most
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filter doesn't write to the network, then ::AP_NOBODY_WROTE is returned.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param filter The next filter in the chain
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bucket The current bucket brigade
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This function is used to register an input filter with the system.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * After this registration is performed, then a filter may be added
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * into the filter chain by using ap_add_input_filter() and simply
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * specifying the name.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The name to attach to the filter function
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param filter_func The filter function to name
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or ::
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * AP_FTYPE_CONNECTION
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @see add_input_filter()
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_in_filter_func filter_func,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_type ftype);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * This function is used to register an output filter with the system.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * After this registration is performed, then a filter may be added
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * into the filter chain by using ap_add_output_filter() and simply
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * specifying the name.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The name to attach to the filter function
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param filter_func The filter function to name
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * ::AP_FTYPE_CONNECTION
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @see ap_add_output_filter()
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_out_filter_func filter_func,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ap_filter_type ftype);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Adds a named filter into the filter chain on the specified request record.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The filter will be installed with the specified context pointer.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Filters added in this way will always be placed at the end of the filters
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * that have the same type (thus, the filters have the same order as the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * calls to ap_add_filter). If the current filter chain contains filters
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * from another request, then this filter will be added before those other
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * filters.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * To re-iterate that last comment. This function is building a FIFO
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * list of filters. Take note of that when adding your filter to the chain.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The name of the filter to add
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ctx Context data to provide to the filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param r The request to add this filter for (or NULL if it isn't associated with a request)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param c The connection to add the fillter for
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_t *) ap_add_input_filter(const char *name, void *ctx,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor request_rec *r, conn_rec *c);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Variant of ap_add_input_filter() that accepts a registered filter handle
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * (as returned by ap_register_input_filter()) rather than a filter name
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The filter to add
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ctx Context data to provide to the filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param r The request to add this filter for (or NULL if it isn't associated with a request)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param c The connection to add the fillter for
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_t *) ap_add_input_filter_handle(ap_filter_rec_t *f,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor void *ctx,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor request_rec *r,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor conn_rec *c);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Returns the filter handle for use with ap_add_input_filter_handle.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The filter name to look up
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_rec_t *) ap_get_input_filter_handle(const char *name);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Add a filter to the current request. Filters are added in a FIFO manner.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * The first filter added will be the first filter called.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The name of the filter to add
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ctx Context data to set in the filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param r The request to add this filter for (or NULL if it isn't associated with a request)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param c The connection to add this filter for
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_t *) ap_add_output_filter(const char *name, void *ctx,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor request_rec *r, conn_rec *c);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Variant of ap_add_output_filter() that accepts a registered filter handle
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * (as returned by ap_register_output_filter()) rather than a filter name
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The filter to add
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param r The request to add this filter for (or NULL if it isn't associated with a request)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param c The connection to add the fillter for
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_t *) ap_add_output_filter_handle(ap_filter_rec_t *f,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor void *ctx,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor request_rec *r,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor conn_rec *c);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Returns the filter handle for use with ap_add_output_filter_handle.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor *
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param name The filter name to look up
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(ap_filter_rec_t *) ap_get_output_filter_handle(const char *name);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Remove an input filter from either the request or connection stack
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * it is associated with.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f The filter to remove
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Remove an output filter from either the request or connection stack
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * it is associated with.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f The filter to remove
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/* The next two filters are for abstraction purposes only. They could be
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * done away with, but that would require that we break modules if we ever
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * want to change our filter registration method. The basic idea, is that
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * all filters have a place to store data, the ctx pointer. These functions
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * fill out that pointer with a bucket brigade, and retrieve that data on
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * the next call. The nice thing about these functions, is that they
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * automatically concatenate the bucket brigades together for you. This means
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * that if you have already stored a brigade in the filters ctx pointer, then
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * when you add more it will be tacked onto the end of that brigade. When
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * you retrieve data, if you pass in a bucket brigade to the get function,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * it will append the current brigade onto the one that you are retrieving.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * prepare a bucket brigade to be setaside. If a different brigade was
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * set-aside earlier, then the two brigades are concatenated together.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f The current filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param save_to The brigade that was previously set-aside. Regardless, the
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * new bucket brigade is returned in this location.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param b The bucket brigade to save aside. This brigade is always empty
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * on return
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param p Ensure that all data in the brigade lives as long as this pool
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **save_to,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_bucket_brigade **b, apr_pool_t *p);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Flush function for apr_brigade_* calls. This calls ap_pass_brigade
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * to flush the brigade if the brigade buffer overflows.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to flush
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ctx The filter to pass the brigade to
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE_NONSTD(apr_status_t) ap_filter_flush(apr_bucket_brigade *bb, void *ctx);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Flush the current brigade down the filter stack.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f The current filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to flush
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Write a buffer for the current filter, buffering if possible.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f the filter doing the writing
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to buffer into
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param data The data to write
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param nbyte The number of bytes in the data
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define ap_fwrite(f, bb, data, nbyte) \
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_brigade_write(bb, ap_filter_flush, f, data, nbyte)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Write a buffer for the current filter, buffering if possible.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f the filter doing the writing
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to buffer into
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param str The string to write
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define ap_fputs(f, bb, str) \
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_brigade_puts(bb, ap_filter_flush, f, str)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Write a character for the current filter, buffering if possible.
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f the filter doing the writing
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to buffer into
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param c The character to write
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#define ap_fputc(f, bb, c) \
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_brigade_putc(bb, ap_filter_flush, f, c)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Write an unspecified number of strings to the current filter
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f the filter doing the writing
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to buffer into
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ... The strings to write
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE_NONSTD(apr_status_t) ap_fputstrs(ap_filter_t *f,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_bucket_brigade *bb,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ...);
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor/**
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * Output data to the filter in printf format
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param f the filter doing the writing
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param bb The brigade to buffer into
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param fmt The format string
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor * @param ... The argumets to use to fill out the format string
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzorAP_DECLARE_NONSTD(apr_status_t) ap_fprintf(ap_filter_t *f,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor apr_bucket_brigade *bb,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor const char *fmt,
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor ...)
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor __attribute__((format(printf,3,4)));
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#ifdef __cplusplus
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor}
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#endif
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor#endif /* !AP_FILTER_H */
e3beb23d3d86431f5c42cfe6cf7400573a761d3agryzor