diff options
author | Philip M. Gollucci <pgollucci@apache.org> | 2011-11-10 18:08:04 +0000 |
---|---|---|
committer | Philip M. Gollucci <pgollucci@apache.org> | 2011-11-10 18:08:04 +0000 |
commit | e9806ab9d920ffa7eea1572c94189bb557ff8c52 (patch) | |
tree | e57a032c63b07d6b261dd4f69bce2bab3db3bacd /include/apreq.h | |
parent | 008ccc8212e69e029a97f3b6d066fadbbc0484dc (diff) | |
download | httpd-e9806ab9d920ffa7eea1572c94189bb557ff8c52.tar.gz |
import apreq include files
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1200458 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'include/apreq.h')
-rw-r--r-- | include/apreq.h | 308 |
1 files changed, 308 insertions, 0 deletions
diff --git a/include/apreq.h b/include/apreq.h new file mode 100644 index 0000000000..2d1ba5eba0 --- /dev/null +++ b/include/apreq.h @@ -0,0 +1,308 @@ +/* +** 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 "apr_tables.h" +#include <stddef.h> + +#ifdef __cplusplus + extern "C" { +#endif + +/** + * @file apreq.h + * @brief Main header file... + * @ingroup libapreq2 + * + * Define the generic APREQ_ macros and common data structures. + */ + +#ifndef WIN32 +/** + * The public APREQ functions are declared with APREQ_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + */ +/** APREQ_DECLARE(rettype) apeq_func(args) + */ +#define APREQ_DECLARE(d) APR_DECLARE(d) +/** + * The public APEQ functions using variable arguments are declared with + * APEQ_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APEQ_DECLARE @see APEQ_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APEQ_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APREQ_DECLARE_NONSTD(d) APR_DECLARE_NONSTD(d) +/** + * The public APREQ variables are declared with APREQ_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APREQ_DECLARE @see APREQ_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + */ +/** extern APREQ_DECLARE_DATA type apr_variable;\n + * APREQ_DECLARE_DATA type apr_variable = value; + */ +#define APREQ_DECLARE_DATA +#elif defined (APREQ_DECLARE_STATIC) +#define APREQ_DECLARE(type) type __stdcall +#define APREQ_DECLARE_NONSTD(type) type +#define APREQ_DECLARE_DATA +#elif defined (APREQ_DECLARE_EXPORT) +#define APREQ_DECLARE(type) __declspec(dllexport) type __stdcall +#define APREQ_DECLARE_NONSTD(type) __declspec(dllexport) type +#define APREQ_DECLARE_DATA __declspec(dllexport) +#else +#define APREQ_DECLARE(type) __declspec(dllimport) type __stdcall +#define APREQ_DECLARE_NONSTD(type) __declspec(dllimport) type +#define APREQ_DECLARE_DATA __declspec(dllimport) +#endif + +/** + * 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 detroy 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 detroyed 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 */ |