blob: a0c0b909b684e864658827a17ef64bc3dd9c2949 [file] [log] [blame]
/*
** Licensed to the Apache Software Foundation (ASF) under one or more
** contributor license agreements. See the NOTICE file distributed with
** this work for additional information regarding copyright ownership.
** The ASF licenses this file to You 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 APREQ_APACHE2_H
#define APREQ_APACHE2_H
#include "apreq_module.h"
#include "apr_optional.h"
#include <httpd.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @defgroup mod_apreq2 Apache 2.X Filter Module
* @ingroup APACHE_MODS
* @brief mod_apreq2 - DSO that ties libapreq2 to Apache HTTPD 2.X.
*
* mod_apreq2 provides the "APREQ2" input filter for using libapreq2
* (and allow its parsed data structures to be shared) within
* the Apache 2.X webserver. Using it, libapreq2 works properly
* in every phase of the HTTP request, from translation handlers
* to output filters, and even for subrequests / internal redirects.
*
* <hr>
*
* <h2>Activating mod_apreq2 in Apache 2.X</h2>
*
* The installation process triggered by
* <code>% make install</code>
* <em>will not modify your webserver's config file</em>. Hence,
* be sure you activate it on startup by adding a LoadModule directive
* to your webserver config; e.g.
*
* @code
*
* LoadModule apreq_module modules/mod_apreq2.so
*
* @endcode
*
* The mod_apreq2 filter is named "apreq2", and may be used in Apache's
* input filter directives, e.g.
* @code
*
* AddInputFilter apreq2 # or
* SetInputFilter apreq2
*
* @endcode
*
* However, this is not required because libapreq2 will add the filter (only)
* if it's necessary. You just need to ensure that your module invokes
* apreq_handle_apache2() <em>before the content handler ultimately reads
* from the input filter chain</em>. It is important to realize that no
* matter how the input filters are initially arranged, the APREQ2 filter
* will attempt to reposition itself to be the last input filter to read the
* data.
*
* If you want to use other input filters to transform the incoming HTTP
* request data, is important to register those filters with Apache
* as having type AP_FTYPE_CONTENT_SET or AP_FTYPE_RESOURCE. Due to the
* limitations of Apache's current input filter design, types higher than
* AP_FTYPE_CONTENT_SET may not work properly whenever the apreq filter is
* active.
*
* This is especially true when a content handler uses libapreq2 to parse
* some of the post data before doing an internal redirect. Any input
* filter subsequently added to the redirected request will bypass the
* original apreq filter (and therefore lose access to some of the original
* post data), unless its type is less than the type of the apreq filter
* (currently AP_FTYPE_PROTOCOL-1).
*
*
* <H2>Server Configuration Directives</H2>
*
* <TABLE class="qref">
* <CAPTION>Per-directory commands for mod_apreq2</CAPTION>
* <TR>
* <TH>Directive</TH>
* <TH>Context</TH>
* <TH>Default</TH><TH>Description</TH>
* </TR>
* <TR class="odd">
* <TD>APREQ2_ReadLimit</TD>
* <TD>directory</TD>
* <TD> #APREQ_DEFAULT_READ_LIMIT </TD>
* <TD> Maximum number of bytes mod_apreq2 will send off to libapreq2
* for parsing. mod_apreq2 will log this event and subsequently
* remove itself from the filter chain.
* </TD>
* </TR>
* <TR>
* <TD>APREQ2_BrigadeLimit</TD>
* <TD>directory</TD>
* <TD>#APREQ_DEFAULT_BRIGADE_LIMIT</TD>
* <TD> Maximum number of bytes mod_apreq2 will let accumulate
* within the heap-buckets in a brigade. Excess data will be
* spooled to an appended file bucket.
* </TD>
* </TR>
* <TR class="odd">
* <TD>APREQ2_TempDir</TD>
* <TD>directory</TD>
* <TD>NULL</TD>
* <TD> Sets the location of the temporary directory apreq will use to spool
* overflow brigade data (based on the APREQ2_BrigadeLimit setting).
* If left unset, libapreq2 will select a platform-specific location
* via apr_temp_dir_get().
* </TD>
* </TR>
* </TABLE>
*
* <H2>Implementation Details</H2>
* <PRE>
* XXX apreq as a normal input filter
* XXX apreq as a "virtual" content handler.
* XXX apreq as a transparent "tee".
* XXX apreq parser registration in post_config
* </PRE>
*
* @{
*/
/**
* Create an apreq handle which communicates with an Apache 2.X
* request_rec.
*/
APREQ_DECLARE(apreq_handle_t *) apreq_handle_apache2(request_rec *r);
/**
*
*
*/
#ifdef WIN32
typedef __declspec(dllexport) apreq_handle_t *
(__stdcall apr_OFN_apreq_handle_apache2_t) (request_rec *r);
#else
APR_DECLARE_OPTIONAL_FN(APREQ_DECLARE(apreq_handle_t *),
apreq_handle_apache2, (request_rec *r));
#endif
/**
* The mod_apreq2 filter is named "apreq2", and may be used in Apache's
* input filter directives, e.g.
* @code
*
* AddInputFilter apreq2 # or
* SetInputFilter apreq2
* @endcode
* See above
*/
#define APREQ_FILTER_NAME "apreq2"
/**
* The Apache2 Module Magic Number for use in the Apache 2.x module structures
* This gets bumped if changes in th4e API will break third party applications
* using this apache2 module
* @see APREQ_MODULE
*/
#define APREQ_APACHE2_MMN 20101207
/** @} */
#ifdef __cplusplus
}
#endif
#endif