|  | /* | 
|  | **  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_H | 
|  | #define APREQ_H | 
|  |  | 
|  | #ifdef APREQ_DEBUG | 
|  | #include <assert.h> | 
|  | #endif | 
|  |  | 
|  | #include "ap_config.h" | 
|  | #include "apr_tables.h" | 
|  | #include <stddef.h> | 
|  |  | 
|  | #ifdef  __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * @file apreq.h | 
|  | * @brief Main header file... | 
|  | * @ingroup libapreq2 | 
|  | * | 
|  | * Define the common data structures. | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * Read chucks of data in 64k blocks from the request | 
|  | */ | 
|  |  | 
|  | #define APREQ_DEFAULT_READ_BLOCK_SIZE   (64  * 1024) | 
|  |  | 
|  | /** | 
|  | * 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. | 
|  | * @see ap_set_read_limit | 
|  | */ | 
|  | #define APREQ_DEFAULT_READ_LIMIT        (64 * 1024 * 1024) | 
|  | /** | 
|  | * 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 | 
|  | * @see ap_set_brigade_read_limit | 
|  | */ | 
|  | #define APREQ_DEFAULT_BRIGADE_LIMIT     (256 * 1024) | 
|  |  | 
|  | /** | 
|  | * Number of elements in the initial apr_table | 
|  | * @see apr_table_make | 
|  | */ | 
|  | #define APREQ_DEFAULT_NELTS              8 | 
|  |  | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Check to see if specified bit f is off in bitfield name | 
|  | */ | 
|  | #define APREQ_FLAGS_OFF(f, name) ((f) &= ~(name##_MASK << name##_BIT)) | 
|  | /** | 
|  | * Check to see if specified bit f is on in bitfield name | 
|  | */ | 
|  | #define APREQ_FLAGS_ON(f, name)  ((f) |=  (name##_MASK << name##_BIT)) | 
|  | /** | 
|  | *  Get specified bit f in bitfield name | 
|  | */ | 
|  | #define APREQ_FLAGS_GET(f, name) (((f) >> name##_BIT) & name##_MASK) | 
|  | /** | 
|  | * Set specified bit f in bitfield name to value | 
|  | * Note the below BIT/Mask defines are used sans the | 
|  | * _BIT, _MASK because of the this define's \#\#_MASK, \#\#_BIT usage. | 
|  | * Each come in a pair | 
|  | */ | 
|  | #define APREQ_FLAGS_SET(f, name, value)                 \ | 
|  | ((f) = (((f) & ~(name##_MASK << name##_BIT))        \ | 
|  | | ((name##_MASK & (value)) << name##_BIT))) | 
|  |  | 
|  | /** | 
|  | * Charset Bit | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_CHARSET_BIT           0 | 
|  |  | 
|  | /** | 
|  | * Charset Mask | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_CHARSET_MASK        255 | 
|  |  | 
|  | /** | 
|  | * Tainted Bit | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_TAINTED_BIT           8 | 
|  | /** | 
|  | * Tainted Mask | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_TAINTED_MASK          1 | 
|  |  | 
|  | /** | 
|  | * Cookier Version Bit | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  |  | 
|  | #define APREQ_COOKIE_VERSION_BIT   11 | 
|  | /** | 
|  | * Cookie Version Mask | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_COOKIE_VERSION_MASK   3 | 
|  |  | 
|  | /** | 
|  | * Cookie's Secure Bit | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_COOKIE_SECURE_BIT    13 | 
|  | /** | 
|  | * Cookie's Secure Mask | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_COOKIE_SECURE_MASK    1 | 
|  |  | 
|  | /** | 
|  | * Cookie's HttpOnly Bit | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_COOKIE_HTTPONLY_BIT    14 | 
|  | /** | 
|  | * Cookie's HttpOnly Mask | 
|  | * @see APREQ_FLAGS_OFF @see APREQ_FLAGS_ON | 
|  | * @see APREQ_FLAGS_GET @see APREQ_FLAGS_SET | 
|  | */ | 
|  | #define APREQ_COOKIE_HTTPONLY_MASK    1 | 
|  |  | 
|  | /** Character encodings. */ | 
|  | typedef enum { | 
|  | APREQ_CHARSET_ASCII  =0, | 
|  | APREQ_CHARSET_LATIN1 =1, /* ISO-8859-1   */ | 
|  | APREQ_CHARSET_CP1252 =2, /* Windows-1252 */ | 
|  | APREQ_CHARSET_UTF8   =8 | 
|  | } apreq_charset_t; | 
|  |  | 
|  |  | 
|  | /** @enum apreq_join_t Join type */ | 
|  | typedef enum { | 
|  | APREQ_JOIN_AS_IS,      /**< Join the strings without modification */ | 
|  | APREQ_JOIN_ENCODE,     /**< Url-encode the strings before joining them */ | 
|  | APREQ_JOIN_DECODE,     /**< Url-decode the strings before joining them */ | 
|  | APREQ_JOIN_QUOTE       /**< Quote the strings, backslashing existing quote marks. */ | 
|  | } apreq_join_t; | 
|  |  | 
|  | /** @enum apreq_match_t Match type */ | 
|  | typedef enum { | 
|  | APREQ_MATCH_FULL,       /**< Full match only. */ | 
|  | APREQ_MATCH_PARTIAL     /**< Partial matches are ok. */ | 
|  | } apreq_match_t; | 
|  |  | 
|  | /** @enum apreq_expires_t Expiration date format */ | 
|  | typedef enum { | 
|  | APREQ_EXPIRES_HTTP,       /**< Use date formatting consistent with RFC 2616 */ | 
|  | APREQ_EXPIRES_NSCOOKIE    /**< Use format consistent with Netscape's Cookie Spec */ | 
|  | } apreq_expires_t; | 
|  |  | 
|  |  | 
|  | /** @brief libapreq's pre-extensible string type */ | 
|  | typedef struct apreq_value_t { | 
|  | char             *name;    /**< value name */ | 
|  | apr_size_t        nlen;    /**< length of name */ | 
|  | apr_size_t        dlen;    /**< length of data */ | 
|  | char              data[1]; /**< value data  */ | 
|  | } apreq_value_t; | 
|  |  | 
|  | /** | 
|  | * Adds the specified apreq_value_t to the apr_table_t. | 
|  | * | 
|  | * @param v value to add | 
|  | * @param t add v to this table | 
|  | * | 
|  | * @return void | 
|  | * | 
|  | * @ see apr_table_t @see apr_value_t | 
|  | */ | 
|  |  | 
|  | static APR_INLINE | 
|  | void apreq_value_table_add(const apreq_value_t *v, apr_table_t *t) { | 
|  | apr_table_addn(t, v->name, v->data); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * @param T type | 
|  | * @param A attribute | 
|  | * @param P | 
|  | * | 
|  | * XXX | 
|  | */ | 
|  | #define apreq_attr_to_type(T,A,P) ( (T*) ((char*)(P)-offsetof(T,A)) ) | 
|  |  | 
|  | /** | 
|  | * Initialize libapreq2. Applications (except apache modules using | 
|  | * mod_apreq) should call this exactly once before they use any | 
|  | * libapreq2 modules.  If you want to modify the list of default parsers | 
|  | * with apreq_register_parser(), please use apreq_pre_initialize() | 
|  | * and apreq_post_initialize() instead. | 
|  | * | 
|  | * @param pool a base pool persisting while libapreq2 is used | 
|  | * @remarks after you destroy the pool, you have to call this function again | 
|  | *    with a new pool if you still plan to use libapreq2 | 
|  | */ | 
|  | APREQ_DECLARE(apr_status_t) apreq_initialize(apr_pool_t *pool); | 
|  |  | 
|  |  | 
|  | /** | 
|  | * Pre-initialize libapreq2. Applications (except apache modules using | 
|  | * mod_apreq2) should call this exactly once before they register custom | 
|  | * parsers with libapreq2. mod_apreq2 does this automatically during the | 
|  | * post-config phase, so modules that need call apreq_register_parser should | 
|  | * create a post-config hook using APR_HOOK_MIDDLE. | 
|  | * | 
|  | * @param pool a base pool persisting while libapreq2 is used | 
|  | * @remarks after you destroyed the pool, you have to call this function again | 
|  | *    with a new pool if you still plan to use libapreq2 | 
|  | */ | 
|  | APREQ_DECLARE(apr_status_t) apreq_pre_initialize(apr_pool_t *pool); | 
|  |  | 
|  | /** | 
|  | * Post-initialize libapreq2. Applications (except apache modules using | 
|  | * mod_apreq2) should this exactly once before they use any | 
|  | * libapreq2 modules for parsing. | 
|  | * | 
|  | * @param pool the same pool that was used in apreq_pre_initialize(). | 
|  | */ | 
|  | APREQ_DECLARE(apr_status_t) apreq_post_initialize(apr_pool_t *pool); | 
|  |  | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif /* APREQ_H */ |