Viewing file: mod_include.h (11.5 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* ==================================================================== * The Apache Software License, Version 1.1 * * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Apache" and "Apache Software Foundation" must * not be used to endorse or promote products derived from this * software without prior written permission. For written * permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", * nor may "Apache" appear in their name, without prior written * permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * * Portions of this software are based upon public domain software * originally written at the National Center for Supercomputing Applications, * University of Illinois, Urbana-Champaign. */
#ifndef _MOD_INCLUDE_H #define _MOD_INCLUDE_H 1
#include "apr_pools.h" #include "apr_optional.h"
#define STARTING_SEQUENCE "<!--#" #define ENDING_SEQUENCE "-->"
#define DEFAULT_ERROR_MSG "[an error occurred while processing this directive]" #define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z" #define SIZEFMT_BYTES 0 #define SIZEFMT_KMG 1 #define TMP_BUF_SIZE 1024 #if APR_CHARSET_EBCDIC #define RAW_ASCII_CHAR(ch) apr_xlate_conv_byte(ap_hdrs_from_ascii, (unsigned char)ch) #else /*APR_CHARSET_EBCDIC*/ #define RAW_ASCII_CHAR(ch) (ch) #endif /*APR_CHARSET_EBCDIC*/
/**************************************************************************** * Used to keep context information during parsing of a request for SSI tags. * This is especially useful if the tag stretches across multiple buckets or * brigades. This keeps track of which buckets need to be replaced with the * content generated by the SSI tag. * * state: PRE_HEAD - State prior to finding the first character of the * STARTING_SEQUENCE. Next state is PARSE_HEAD. * PARSE_HEAD - State entered once the first character of the * STARTING_SEQUENCE is found and exited when the * the full STARTING_SEQUENCE has been matched or * a match failure occurs. Next state is PRE_HEAD * or PARSE_TAG. * PARSE_TAG - State entered once the STARTING sequence has been * matched. It is exited when the first character in * ENDING_SEQUENCE is found. Next state is PARSE_TAIL. * PARSE_TAIL - State entered from PARSE_TAG state when the first * character in ENDING_SEQUENCE is encountered. This * state is exited when the ENDING_SEQUENCE has been * completely matched, or when a match failure occurs. * Next state is PARSE_TAG or PARSED. * PARSED - State entered from PARSE_TAIL once the complete * ENDING_SEQUENCE has been matched. The SSI tag is * processed and the SSI buckets are replaced with the * SSI content during this state. * parse_pos: Current matched position within the STARTING_SEQUENCE or * ENDING_SEQUENCE during the PARSE_HEAD and PARSE_TAIL states. * This is especially useful when the sequence spans brigades. * X_start_bucket: These point to the buckets containing the first character * of the STARTING_SEQUENCE, the first non-whitespace * character of the tag, and the first character in the * ENDING_SEQUENCE (head_, tag_, and tail_ respectively). * The buckets are kept intact until the PARSED state is * reached, at which time the tag is consolidated and the * buckets are released. The buckets that these point to * have all been set aside in the ssi_tag_brigade (along * with all of the intervening buckets). * X_start_index: The index points within the specified bucket contents * where the first character of the STARTING_SEQUENCE, * the first non-whitespace character of the tag, and the * first character in the ENDING_SEQUENCE can be found * (head_, tag_, and tail_ respectively). * combined_tag: Once the PARSED state is reached the tag is collected from * the bucket(s) in the ssi_tag_brigade into this contiguous * buffer. The buckets in the ssi_tag_brigade are released * and the tag is processed. * curr_tag_pos: Ptr to the combined_tag buffer indicating the current * parse position. * tag_length: The number of bytes in the actual tag (excluding the * STARTING_SEQUENCE, leading and trailing whitespace, * and ENDING_SEQUENCE). This length is computed as the * buckets are parsed and set aside during the PARSE_TAG state. * ssi_tag_brigade: The temporary brigade used by this filter to set aside * the buckets containing parts of the ssi tag and headers. */ typedef enum {PRE_HEAD, PARSE_HEAD, PARSE_DIRECTIVE, PARSE_TAG, PARSE_TAIL, PARSED} states;
/** forward referenced as it needs to be held on the context */ typedef struct bndm_t bndm_t;
typedef struct include_filter_ctx { states state; long flags; /* See the FLAG_XXXXX definitions. */ int if_nesting_level; apr_size_t parse_pos; int bytes_parsed; apr_status_t status; int output_now; int output_flush; apr_bucket *head_start_bucket; apr_size_t head_start_index;
apr_bucket *tag_start_bucket; apr_size_t tag_start_index;
apr_bucket *tail_start_bucket; apr_size_t tail_start_index;
char *combined_tag; char *curr_tag_pos; apr_size_t directive_length; apr_size_t tag_length;
char *error_str; char *error_str_override; char *time_str; char *time_str_override; apr_pool_t *pool;
apr_bucket_brigade *ssi_tag_brigade; bndm_t *start_seq_pat; char *start_seq; int start_seq_len; char *end_seq; char *re_string; regmatch_t (*re_result)[10]; } include_ctx_t;
/* These flags are used to set flag bits. */ #define FLAG_PRINTING 0x00000001 /* Printing conditional lines. */ #define FLAG_COND_TRUE 0x00000002 /* Conditional eval'd to true. */ #define FLAG_SIZE_IN_BYTES 0x00000004 /* Sizes displayed in bytes. */ #define FLAG_NO_EXEC 0x00000008 /* No Exec in current context. */
/* These flags are used to clear flag bits. */ #define FLAG_SIZE_ABBREV 0xFFFFFFFB /* Reset SIZE_IN_BYTES bit. */ #define FLAG_CLEAR_PRINT_COND 0xFFFFFFFC /* Reset PRINTING and COND_TRUE*/ #define FLAG_CLEAR_PRINTING 0xFFFFFFFE /* Reset just PRINTING bit. */
#define CREATE_ERROR_BUCKET(cntx, t_buck, h_ptr, ins_head) \ { \ /* XXX: it'd probably be nice to use a pool bucket here */ \ t_buck = apr_bucket_heap_create(cntx->error_str, \ strlen(cntx->error_str), \ NULL, h_ptr->list); \ APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ \ if (ins_head == NULL) { \ ins_head = t_buck; \ } \ }
/* Make sure to check the return code rc. If it is anything other * than APR_SUCCESS, then you should return this value up the * call chain. */ #define SPLIT_AND_PASS_PRETAG_BUCKETS(brgd, cntxt, next, rc) \ if ((APR_BRIGADE_EMPTY((cntxt)->ssi_tag_brigade)) && \ ((cntxt)->head_start_bucket != NULL)) { \ apr_bucket_brigade *tag_plus; \ \ tag_plus = apr_brigade_split((brgd), (cntxt)->head_start_bucket); \ if ((cntxt)->output_flush) { \ APR_BRIGADE_INSERT_TAIL((brgd), apr_bucket_flush_create((brgd)->bucket_alloc)); \ } \ (rc) = ap_pass_brigade((next), (brgd)); \ (cntxt)->bytes_parsed = 0; \ (brgd) = tag_plus; \ }
typedef int (include_handler_fn_t)(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head);
APR_DECLARE_OPTIONAL_FN(void, ap_ssi_get_tag_and_value, (include_ctx_t *ctx, char **tag, char **tag_val, int dodecode)); APR_DECLARE_OPTIONAL_FN(char*, ap_ssi_parse_string, (request_rec *r, include_ctx_t *ctx, const char *in, char *out, apr_size_t length, int leave_name)); APR_DECLARE_OPTIONAL_FN(void, ap_register_include_handler, (char *tag, include_handler_fn_t *func));
#endif /* MOD_INCLUDE */
|