25#define APR_WANT_STRFUNC
26#define APR_WANT_MEMFUNC
47#define RAW_ASCII_CHAR(ch) apr_xlate_conv_byte(ap_hdrs_from_ascii, \
50#define RAW_ASCII_CHAR(ch) (ch)
224#define TYPE_TOKEN(token, ttype) do { \
225 (token)->type = ttype; \
226 (token)->s = #ttype; \
229#define CREATE_NODE(ctx, name) do { \
230 (name) = apr_palloc((ctx)->dpool, sizeof(*(name))); \
231 (name)->parent = (name)->left = (name)->right = NULL; \
233 (name)->dump_done = 0; \
247 ctx->intern->debug.f->c->bucket_alloc));
250#define DUMP__CHILD(ctx, is, node, child) if (1) { \
251 parse_node_t *d__c = node->child; \
253 if (!d__c->dump_done) { \
254 if (d__c->parent != node) { \
255 debug_printf(ctx, "!!! Parse tree is not consistent !!!\n"); \
256 if (!d__c->parent) { \
257 debug_printf(ctx, "Parent of " #child " child node is " \
261 debug_printf(ctx, "Parent of " #child " child node " \
262 "points to another node (of type %s)!\n", \
263 d__c->parent->token.s); \
272 debug_printf(ctx, "%s(missing)\n", is); \
296 current->dump_done = 1;
297 current = current->
parent;
304 if (!current->dump_done) {
307 current->dump_done = 1;
312 if (!current->
right || current->
right->dump_done) {
314 if (current->
right) current->
right->dump_done = 0;
315 current = current->
parent;
320 if (!current->dump_done) {
323 current->dump_done = 1;
329 if ((!current->
left || current->
left->dump_done) &&
330 (!current->
right || current->
right->dump_done)) {
333 if (current->
left) current->
left->dump_done = 0;
334 if (current->
right) current->
right->dump_done = 0;
335 current = current->
parent;
346 if (root->
left) root->
left->dump_done = 0;
352#define DEBUG_INIT(ctx, filter, brigade) do { \
353 (ctx)->intern->debug.f = filter; \
354 (ctx)->intern->debug.bb = brigade; \
357#define DEBUG_PRINTF(arg) debug_printf arg
359#define DEBUG_DUMP_TOKEN(ctx, token) do { \
360 token_t *d__t = (token); \
362 if (d__t->type == TOKEN_STRING || d__t->type == TOKEN_RE) { \
363 DEBUG_PRINTF(((ctx), " Found: %s (%s)\n", d__t->s, d__t->value)); \
366 DEBUG_PRINTF((ctx, " Found: %s\n", d__t->s)); \
370#define DEBUG_DUMP_EVAL(ctx, node) do { \
372 switch ((node)->token.type) { \
374 debug_printf((ctx), " Evaluate: %s (%s) -> %c\n", (node)->token.s,\
375 (node)->token.value, ((node)->value) ? '1':'0'); \
379 debug_printf((ctx), " Evaluate: %s (Left: %s; Right: %s) -> %c\n",\
381 (((node)->left->done) ? ((node)->left->value ?"1":"0") \
382 : "short circuited"), \
383 (((node)->right->done) ? ((node)->right->value?"1":"0") \
384 : "short circuited"), \
385 (node)->value ? '1' : '0'); \
393 if ((node)->right->token.type == TOKEN_RE) c = '/'; \
394 debug_printf((ctx), " Compare: %s (\"%s\" with %c%s%c) -> %c\n", \
396 (node)->left->token.value, \
397 c, (node)->right->token.value, c, \
398 (node)->value ? '1' : '0'); \
401 debug_printf((ctx), " Evaluate: %s -> %c\n", (node)->token.s, \
402 (node)->value ? '1' : '0'); \
407#define DEBUG_DUMP_UNMATCHED(ctx, unmatched) do { \
409 DEBUG_PRINTF(((ctx), " Unmatched %c\n", (char)(unmatched))); \
413#define DEBUG_DUMP_COND(ctx, text) \
414 DEBUG_PRINTF(((ctx), "**** %s cond status=\"%c\"\n", (text), \
415 ((ctx)->flags & SSI_FLAG_COND_TRUE) ? '1' : '0'))
417#define DEBUG_DUMP_TREE(ctx, root) debug_dump_tree(ctx, root)
421#define TYPE_TOKEN(token, ttype) (token)->type = ttype
423#define CREATE_NODE(ctx, name) do { \
424 (name) = apr_palloc((ctx)->dpool, sizeof(*(name))); \
425 (name)->parent = (name)->left = (name)->right = NULL; \
429#define DEBUG_INIT(ctx, f, bb)
430#define DEBUG_PRINTF(arg)
431#define DEBUG_DUMP_TOKEN(ctx, token)
432#define DEBUG_DUMP_EVAL(ctx, node)
433#define DEBUG_DUMP_UNMATCHED(ctx, unmatched)
434#define DEBUG_DUMP_COND(ctx, text)
435#define DEBUG_DUMP_TREE(ctx, root)
449module AP_MODULE_DECLARE_DATA include_module;
461#define LAZY_VALUE (&lazy_eval_sentinel)
464#define DEFAULT_START_SEQUENCE "<!--#"
465#define DEFAULT_END_SEQUENCE "-->"
466#define DEFAULT_ERROR_MSG "[an error occurred while processing this directive]"
467#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z"
468#define DEFAULT_UNDEFINED_ECHO "(none)"
473#define DEFAULT_XBITHACK XBITHACK_FULL
475#define DEFAULT_XBITHACK XBITHACK_OFF
512 "amp\046ETH\320eth\360",
513 "quot\042Auml\304Euml\313Iuml\317Ouml\326Uuml\334auml\344euml"
514 "\353iuml\357ouml\366uuml\374yuml\377",
516 "Acirc\302Aring\305AElig\306Ecirc\312Icirc\316Ocirc\324Ucirc"
517 "\333THORN\336szlig\337acirc\342aring\345aelig\346ecirc\352"
518 "icirc\356ocirc\364ucirc\373thorn\376",
520 "Agrave\300Aacute\301Atilde\303Ccedil\307Egrave\310Eacute\311"
521 "Igrave\314Iacute\315Ntilde\321Ograve\322Oacute\323Otilde"
522 "\325Oslash\330Ugrave\331Uacute\332Yacute\335agrave\340"
523 "aacute\341atilde\343ccedil\347egrave\350eacute\351igrave"
524 "\354iacute\355ntilde\361ograve\362oacute\363otilde\365"
525 "oslash\370ugrave\371uacute\372yacute\375"
531 for (; *
s !=
'&';
s++) {
537 for (
p =
s; *
s !=
'\0';
s++,
p++) {
543 for (
i = 1;
s[
i] !=
';' &&
s[
i] !=
'\0';
i++) {
558 if (j <
i ||
val <= 8 || (
val >= 11 &&
val <= 31) ||
670 " is out of range (last regex was: '%s') in %s",
700 if ((
name[0] ==
'e') || (
name[0] ==
'E')) {
716 switch (
parms->type) {
786 current->next =
NULL;
787 current->string =
in;
799 if (!
out && current->len) {
800 current->next =
apr_palloc(
ctx->dpool,
sizeof(*current->next));
801 current = current->next;
802 current->next =
NULL;
811 *
out++ = (
p[1] ==
'$') ? *++
p : *
p;
816 current->string = (
p[1] ==
'$') ? ++
p :
p;
862 current->string =
p++;
885 current->string =
val;
900 if (!
out && current->len) {
901 current->next =
apr_palloc(
ctx->dpool,
sizeof(*current->next));
902 current = current->next;
903 current->next =
NULL;
972 "unable to compile pattern \"%s\"", rexp);
1016 switch (*(*
parse)++) {
1028 if (**
parse ==
'=') {
1047 if (**
parse ==
'|') {
1054 if (**
parse ==
'&') {
1061 if (**
parse ==
'=') {
1069 if (**
parse ==
'=') {
1077 if (**
parse ==
'A') {
1092 if (**
parse ==
'\\') {
1172 const char *
error =
APLOGNO(03188)
"Invalid expression \"%s\" in file %s";
1173 const char *
parse = expr;
1195 (current !=
NULL ? ¤t->token :
NULL));
1204 switch (
new->token.type) {
1209 root = current =
new;
1222 switch (
new->token.type) {
1224 switch (current->token.type) {
1226 current->token.value =
1228 *current->token.value ?
" " :
"",
1229 new->token.value,
NULL);
1238 new->parent = current;
1239 current = current->right =
new;
1245 switch (current->token.type) {
1248 new->parent = current;
1249 current = current->right =
new;
1260 switch (current->token.type) {
1264 current = current->parent;
1267 switch (current->token.type) {
1274 current = current->parent;
1283 current = root =
new;
1290 current = current->
right =
new;
1305 current = current->
parent;
1310 current = root =
new;
1314 switch (current->token.type) {
1321 current = current->
right =
new;
1331 while (current && current->token.type !=
TOKEN_LBRACE) {
1332 current = current->
parent;
1340 error =
APLOGNO(03189)
"Unmatched ')' in \"%s\" in file %s";
1346 switch (current->token.type) {
1354 current->right =
new;
1378 switch (current->token.type) {
1380 current->token.value =
1383 current->value = !!*current->token.value;
1388 if (!current->left || !current->right) {
1390 "Invalid expression \"%s\" in file %s",
1396 if (!current->left->done) {
1397 switch (current->left->token.type) {
1399 current->left->token.value =
1402 current->left->value = !!*current->left->token.value;
1404 current->left->done = 1;
1408 current = current->left;
1414 if (!current->right->done && !
regex &&
1415 ((current->token.type ==
TOKEN_AND && !current->left->value) ||
1416 (current->token.type ==
TOKEN_OR && current->left->value))) {
1417 current->value = current->left->value;
1420 if (!current->right->done) {
1421 switch (current->right->token.type) {
1423 current->right->token.value =
1426 current->right->value = !!*current->right->token.value;
1428 current->right->done = 1;
1432 current = current->right;
1438 current->value = current->left->value &&
1439 current->right->value;
1442 current->value = current->left->value ||
1443 current->right->value;
1450 if (!current->left || !current->right ||
1453 current->right->token.type !=
TOKEN_RE)) {
1455 "Invalid expression \"%s\" in file %s",
1460 current->left->token.value =
1463 current->right->token.value =
1467 if (current->right->token.type ==
TOKEN_RE) {
1468 current->value =
re_check(
ctx, current->left->token.value,
1469 current->right->token.value);
1473 current->value = !
strcmp(current->left->token.value,
1474 current->right->token.value);
1477 if (current->token.type ==
TOKEN_NE) {
1478 current->value = !current->value;
1486 if (!current->left || !current->right ||
1490 "Invalid expression \"%s\" in file %s",
1496 current->left->token.value =
1499 current->right->token.value =
1503 current->value =
strcmp(current->left->token.value,
1504 current->right->token.value);
1506 switch (current->token.type) {
1507 case TOKEN_GE: current->value = current->value >= 0;
break;
1508 case TOKEN_GT: current->value = current->value > 0;
break;
1509 case TOKEN_LE: current->value = current->value <= 0;
break;
1510 case TOKEN_LT: current->value = current->value < 0;
break;
1511 default: current->value = 0;
break;
1517 if (current->right) {
1518 if (!current->right->done) {
1519 current = current->right;
1522 current->value = current->right->value;
1529 current->value = !current->value;
1534 if (current->left || !current->right ||
1536 current->right->token.type !=
TOKEN_RE)) {
1538 "Invalid expression \"%s\" in file %s: Token '-A' must be followed by a URI string.",
1543 current->right->token.value =
1554 "mod_include: The tested "
1555 "subrequest -A \"%s\" returned an error code.",
1556 current->right->token.value);
1563 error =
APLOGNO(03190)
"No operator before regex in expr \"%s\" in file %s";
1567 error =
APLOGNO(03191)
"Unmatched '(' in \"%s\" in file %s";
1571 error =
APLOGNO(03192)
"internal parser error in \"%s\" in file %s";
1583 current = current->parent;
1586 return (root ? root->
value : 0);
1606 "Could not parse expr \"%s\" in %s: %s", expr,
1632 eval_ctx->vary_this = &
ctx->intern->expr_vary_this;
1642 "Could not evaluate expr \"%s\" in %s: %s", expr,
1643 ctx->r->filename,
ctx->intern->expr_err);
1670 if (!
ctx->intern->argv) {
1680 ctx->intern->argv =
ctx->intern->argv->next;
1706 "in parsed file %s";
1719 "about \"%s\" in parsed file %s";
1724 "about \"%s\" in parsed file %s";
1746 memcpy((
char *) finfo, (
const char *) &
rr->finfo,
1753 "information about \"%s\" in parsed file %s",
1795 "missing argument for include element in %s",
1833 if (
tag[0] ==
'f') {
1842 error_fmt =
"unable to include file \"%s\" in parsed file %s";
1848 else if ((
tag[0] ==
'v' && !last_error)
1849 || (
tag[0] ==
'o' && last_error)) {
1862 error_fmt =
"unable to include \"%s\" in parsed file %s, subrequest setup returned %d";
1866 rr->content_type &&
strncmp(
rr->content_type,
"text/", 5)) {
1868 error_fmt =
"unable to include potential exec \"%s\" in parsed "
1869 "file %s, content type not text/*";
1881 error_fmt =
"unable to include \"%s\" in parsed file %s, subrequest returned %d";
1929 "missing argument for echo element in %s",
1962 char *
e, *
d, *token;
1993 "\"%s\" to parameter \"decoding\" of tag echo in "
2025 "\"%s\" to parameter \"encoding\" of tag echo in "
2038 e_len =
ctx->intern->undefined_echo_len;
2081 "missing argument for config element in %s",
2108 ctx->intern->undefined_echo =
2110 ctx->intern->undefined_echo_len=strlen(
ctx->intern->undefined_echo);
2139 "\"%s\" to parameter \"sizefmt\" of tag config "
2169 "missing argument for fsize element in %s",
2209 len = l = strlen(tmp);
2211 for (x = 0; x < l; ++x) {
2212 if (x && !((l - x) % 3)) {
2223 for (pos = x = 0; x < l; ++x) {
2224 if (x && !((l - x) % 3)) {
2227 buf[pos++] = tmp[x];
2233 ctx->pool,
f->c->bucket_alloc));
2257 "missing argument for flastmod element in %s",
2289 t_len = strlen(t_val);
2292 ctx->pool,
f->c->bucket_alloc));
2314 if (
ctx->argc != 1) {
2320 ?
APLOGNO(01352)
"too many arguments for if element in %s"
2321 :
APLOGNO(01353)
"missing expr argument for if element in %s",
2326 ++(
ctx->if_nesting_level);
2330 if (
ctx->argc != 1) {
2353 if (
ctx->intern->legacy_expr)
2372 ctx->if_nesting_level = 0;
2388 if (
ctx->argc != 1) {
2393 ?
APLOGNO(01356)
"too many arguments for if element in %s"
2394 :
APLOGNO(01357)
"missing expr argument for if element in %s",
2398 if (
ctx->if_nesting_level) {
2402 if (
ctx->argc != 1) {
2431 if (
ctx->intern->legacy_expr)
2465 "else directive does not take tags in %s",
2469 if (
ctx->if_nesting_level) {
2505 "endif directive does not take tags in %s",
2509 if (
ctx->if_nesting_level) {
2510 --(
ctx->if_nesting_level);
2539 if (
ctx->argc < 2) {
2544 APLOGNO(01362)
"missing argument for set element in %s",
2552 if (
ctx->argc < 2) {
2591 "precede value in set directive in %s",
2602 char *
e, *
d, *token;
2631 "\"%s\" to parameter \"decoding\" of tag set in "
2663 "\"%s\" to parameter \"encoding\" of tag set in "
2708 APLOGNO(01367)
"printenv directive does not take tags in %s",
2768 const char *
ne =
n + nl;
2771 memset(
t->T, 0,
sizeof(
unsigned int) * 256);
2772 t->pattern_len = nl;
2774 for (x = 1;
n <
ne; x <<= 1) {
2775 t->T[(
unsigned char) *
n++] |= x;
2795 const char *
he, *
p, *
pi;
2796 unsigned int *
T, x,
d;
2803 nl =
t->pattern_len;
2897 p =
data + index + 1;
3012 const char *
p =
data;
3016 switch (intern->
state) {
3081 "directive name in parsed document %s",
3111 const char *
p =
data;
3135 const char *
p =
data;
3178 const char *
p =
data;
3181 switch (intern->
state) {
3191 if (!intern->
argv) {
3207 case '"':
case '\'':
case '`':
3217 "argument name for value to tag %s in %s",
3249 "argument name for value to tag %s in %s",
3293 case '"':
case '\'':
case '`':
3297 intern->
quote =
'\0';
3306 if (*
p == intern->
quote) {
3313 for (;
p <
ep; ++
p) {
3314 if (intern->
quote && *
p ==
'\\') {
3321 if (*
p != intern->
quote) {
3350 if (intern->
quote) {
3356 while (
sp <
ep && *
sp !=
'\\') {
3360 if (*
sp ==
'\\' &&
sp[1] == intern->
quote) {
3423 char **store = &
magic;
3472 if (
ctx->flush_now ||
3520 switch (intern->
state) {
3563 f->c->bucket_alloc);
3601 if (store != &
magic) {
3654 if (store != &
magic) {
3672 switch (intern->
state) {
3702 if (intern->
error) {
3725 "unknown directive \"%s\" in parsed doc %s",
3757 f->c->bucket_alloc));
3762 "SSI directive was not properly finished at the end "
3771 "missing closing endif directive in parsed document"
3816 f->r->no_local_copy = 1;
3823 if (conf->
etag <= 0) {
3842 "mod_include: Options +Includes (or IncludesNoExec) "
3843 "wasn't set, INCLUDES filter removed: %s",
r->
uri);
3873 ctx->if_nesting_level = 0;
3980#if defined(OS2) || defined(WIN32) || defined(NETWARE)
4035#define MERGE(b,o,n,val,unset) n->val = o->val != unset ? o->val : b->val
4076 return "XBitHack must be set to Off, On, or Full";
4086 const char *
p =
tag;
4091 return "SSIStartTag may not contain any whitespaces";
4106 const char *
p =
tag;
4111 return "SSIEndTag may not contain any whitespaces";
4186 "Off, On, or Full"),
4190 "a strftime(3) formatted string"),
4192 "SSI Start String Tag"),
4194 "SSI End String Tag"),
4196 "String to be displayed if an echoed variable is undefined"),
4200 "Whether to use the legacy expression parser compatible "
4201 "with <= 2.2.x. Limited to 'on' or 'off'"),
4204 OR_LIMIT,
"Whether to set the last modified header or respect "
4205 "an existing header. Limited to 'on' or 'off'"),
4208 OR_LIMIT,
"Whether to allow the generation of ETags within the server. "
4209 "Existing ETags will be preserved. Limited to 'on' or 'off'"),
Symbol export macros and hook functions.
#define AP_EXPR_FUNC_STRING
int int const char ** match
const char apr_size_t len
APR general purpose library routines.
APR-UTIL registration of functions exported by modules.
apr_size_t const unsigned char unsigned int unsigned int d
APR Thread and Process Library.
APR Standard Headers Support.
#define AP_INIT_TAKE1(directive, func, mconfig, where, help)
#define ap_get_module_config(v, m)
void ap_hook_post_config(ap_HOOK_post_config_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
#define AP_DECLARE_MODULE(foo)
#define AP_INIT_FLAG(directive, func, mconfig, where, help)
const char * ap_set_flag_slot_char(cmd_parms *cmd, void *struct_ptr, int arg)
#define ap_set_module_config(v, m, val)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
ap_filter_rec_t * ap_register_output_filter(const char *name, ap_out_filter_func filter_func, ap_init_filter_func filter_init, ap_filter_type ftype)
ap_filter_t * ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
void ap_remove_output_filter(ap_filter_t *f)
#define OPT_INC_WITH_EXEC
#define AP_MIN_BYTES_TO_WRITE
int ap_allow_options(request_rec *r)
#define APLOG_MODULE_INDEX
const unsigned char * buf
void ap_set_last_modified(request_rec *r)
void ap_set_content_type_ex(request_rec *r, const char *ct, int trusted)
request_rec * ap_sub_req_lookup_uri(const char *new_uri, const request_rec *r, ap_filter_t *next_filter)
int ap_run_sub_req(request_rec *r)
request_rec * ap_sub_req_lookup_file(const char *new_file, const request_rec *r, ap_filter_t *next_filter)
void ap_hook_fixups(ap_HOOK_fixups_t *pf, const char *const *aszPre, const char *const *aszSucc, int nOrder)
void ap_destroy_sub_req(request_rec *r)
request_rec * ap_sub_req_method_uri(const char *method, const char *new_uri, const request_rec *r, ap_filter_t *next_filter)
void ap_update_mtime(request_rec *r, apr_time_t dependency_mtime)
void ap_add_common_vars(request_rec *r)
void ap_add_cgi_vars(request_rec *r)
#define APR_STATUS_IS_EAGAIN(s)
#define APR_BUCKET_IS_FLUSH(e)
#define APR_BUCKET_REMOVE(e)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_PREPEND(a, b)
#define APR_BRIGADE_INSERT_TAIL(b, e)
#define apr_bucket_split(e, point)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
#define apr_bucket_setaside(e, p)
#define APR_BRIGADE_FIRST(b)
#define APR_BUCKET_INSERT_BEFORE(a, b)
#define apr_bucket_read(e, str, len, block)
apr_pool_t const char apr_dbd_t const char ** error
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
const char apr_ssize_t slen
#define APR_HOOK_REALLY_FIRST
apr_memcache_server_t * server
#define APR_RETRIEVE_OPTIONAL_FN(name)
#define APR_OPTIONAL_FN_TYPE(name)
#define APR_REGISTER_OPTIONAL_FN(name)
const char * ap_expr_parse(apr_pool_t *pool, apr_pool_t *ptemp, ap_expr_info_t *info, const char *expr, ap_expr_lookup_fn_t *lookup_fn)
int ap_run_expr_lookup(ap_expr_lookup_parms *parms)
#define AP_EXPR_FLAG_RESTRICTED
int ap_expr_exec_ctx(ap_expr_eval_ctx_t *ctx)
#define SSI_FLAG_CLEAR_PRINTING
#define SSI_FLAG_CLEAR_PRINT_COND
#define SSI_FLAG_PRINTING
#define SSI_FLAG_COND_TRUE
#define SSI_FLAG_SIZE_ABBREV
#define SSI_EXPAND_DROP_NAME
#define SSI_CREATE_ERROR_BUCKET(ctx, f, bb)
#define SSI_VALUE_DECODED
#define SSI_FLAG_SIZE_IN_BYTES
apr_status_t() include_handler_fn_t(include_ctx_t *, ap_filter_t *, apr_bucket_brigade *)
#define STANDARD20_MODULE_STUFF
#define apr_pool_join(a, b)
int ap_cstr_casecmp(const char *s1, const char *s2)
char * ap_pbase64encode(apr_pool_t *p, char *string)
#define ap_escape_uri(ppool, path)
int ap_unescape_urlencoded(char *query)
char * ap_escape_shell_cmd(apr_pool_t *p, const char *s)
#define ap_strchr_c(s, c)
char * ap_pbase64decode(apr_pool_t *p, const char *bufcoded)
char * ap_escape_html2(apr_pool_t *p, const char *s, int toasc)
char * ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt)
#define ap_escape_html(p, s)
void ap_str_tolower(char *s)
char * ap_escape_urlencoded(apr_pool_t *p, const char *s)
int ap_unescape_url(char *url)
ap_regex_t * ap_pregcomp(apr_pool_t *p, const char *pattern, int cflags)
void ap_pregfree(apr_pool_t *p, ap_regex_t *reg)
const char int apr_pool_t * pool
#define APR_FILEPATH_SECUREROOTTEST
#define APR_FILEPATH_NOTABSOLUTE
apr_array_header_t ** result
int strcasecmp(const char *a, const char *b)
apr_vformatter_buff_t const char * fmt
apr_vformatter_buff_t * c
apr_vformatter_buff_t const char va_list ap
char const *const char const *const ** env
apr_interval_time_t apr_pollcb_cb_t func
#define apr_pool_create(newpool, parent)
#define apr_pcalloc(p, size)
const apr_array_header_t * arr
apr_int32_t apr_int32_t apr_int32_t err
#define DEFAULT_TIME_FORMAT
#define DEBUG_DUMP_TREE(ctx, root)
static apr_status_t handle_echo(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static void ap_register_include_handler(char *tag, include_handler_fn_t *func)
static const char * get_include_var(const char *var, include_ctx_t *ctx)
static apr_status_t handle_printenv(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
@ PARSE_DIRECTIVE_POSTTAIL
@ PARSE_DIRECTIVE_POSTNAME
#define DEBUG_DUMP_EVAL(ctx, node)
static void ap_ssi_get_tag_and_value(include_ctx_t *ctx, char **tag, char **tag_val, int dodecode)
struct arg_item arg_item_t
#define DEFAULT_UNDEFINED_ECHO
static APR_INLINE int re_check(include_ctx_t *ctx, const char *string, const char *rexp)
#define CREATE_NODE(ctx, name)
static const char * set_default_error_msg(cmd_parms *cmd, void *mconfig, const char *msg)
static apr_status_t send_parsed_content(ap_filter_t *f, apr_bucket_brigade *bb)
#define DEBUG_DUMP_COND(ctx, text)
static const char * include_expr_var_fn(ap_expr_eval_ctx_t *eval_ctx, const void *data, const char *arg)
static int parse_expr(include_ctx_t *ctx, const char *expr, int *was_error)
static apr_status_t handle_set(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static apr_OFN_ap_register_include_handler_t * ssi_pfn_register
static apr_size_t find_argument(include_ctx_t *ctx, const char *data, apr_size_t len, char ***store, apr_size_t **store_len)
static apr_status_t handle_comment(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static apr_size_t find_tail(include_ctx_t *ctx, const char *data, apr_size_t len)
static void add_include_vars(request_rec *r)
#define TYPE_TOKEN(token, ttype)
#define MERGE(b, o, n, val, unset)
static int includes_setup(ap_filter_t *f)
static apr_status_t includes_filter(ap_filter_t *f, apr_bucket_brigade *b)
static const char * set_default_end_tag(cmd_parms *cmd, void *mconfig, const char *tag)
static int include_expr_lookup(ap_expr_lookup_parms *parms)
static void * merge_includes_dir_config(apr_pool_t *p, void *basev, void *overridesv)
static apr_size_t find_arg_or_tail(include_ctx_t *ctx, const char *data, apr_size_t len)
static int include_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
static void * create_includes_server_config(apr_pool_t *p, server_rec *server)
static apr_size_t find_directive(include_ctx_t *ctx, const char *data, apr_size_t len, char ***store, apr_size_t **store_len)
static apr_status_t handle_if(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static const char * set_default_time_fmt(cmd_parms *cmd, void *mconfig, const char *fmt)
static int find_file(request_rec *r, const char *directive, const char *tag, char *tag_val, apr_finfo_t *finfo)
#define DEBUG_PRINTF(arg)
static int parse_ap_expr(include_ctx_t *ctx, const char *expr, int *was_error)
#define DEBUG_DUMP_UNMATCHED(ctx, unmatched)
static apr_size_t find_partial_start_sequence(include_ctx_t *ctx, const char *data, apr_size_t len, apr_size_t *release)
static apr_status_t handle_endif(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
#define DEFAULT_END_SEQUENCE
static apr_status_t handle_config(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static apr_size_t bndm(bndm_t *t, const char *h, apr_size_t hl)
static apr_status_t handle_else(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static void register_hooks(apr_pool_t *p)
static const char lazy_eval_sentinel
static int get_ptoken(include_ctx_t *ctx, const char **parse, token_t *token, token_t *previous)
static const char * set_default_start_tag(cmd_parms *cmd, void *mconfig, const char *tag)
static void * create_includes_dir_config(apr_pool_t *p, char *dummy)
#define DEBUG_INIT(ctx, f, bb)
static void decodehtml(char *s)
static const char * set_xbithack(cmd_parms *cmd, void *mconfig, const char *arg)
#define RAW_ASCII_CHAR(ch)
static const char * add_include_vars_lazy(request_rec *r, const char *var, const char *timefmt)
#define DEFAULT_ERROR_MSG
static bndm_t * bndm_compile(apr_pool_t *pool, const char *n, apr_size_t nl)
static apr_status_t handle_elif(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static apr_status_t handle_include(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
#define DEFAULT_START_SEQUENCE
struct result_item result_item_t
static apr_size_t find_start_sequence(include_ctx_t *ctx, const char *data, apr_size_t len)
static apr_hash_t * include_handlers
static int include_fixup(request_rec *r)
struct parse_node parse_node_t
static apr_status_t handle_flastmod(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static const char * set_undefined_echo(cmd_parms *cmd, void *mconfig, const char *msg)
static const command_rec includes_cmds[]
static char * ap_ssi_parse_string(include_ctx_t *ctx, const char *in, char *out, apr_size_t length, int leave_name)
#define DEBUG_DUMP_TOKEN(ctx, token)
static apr_status_t handle_fsize(include_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *bb)
Server Side Include Filter Extension Module for Apache.
static int parse(server_rec *, apr_pool_t *p, char *, int)
The representation of a filter chain.
apr_fileperms_t protection
const char * undefined_echo
const char * default_time_fmt
const char * default_error_msg
const char * default_end_tag
const char * default_start_tag
struct parse_node * parent
struct parse_node * right
A structure that represents the current request.
const char * content_type
apr_bucket_brigade * kept_body
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
struct ap_conf_vector_t * per_dir_config
struct result_item * next
A structure to store information for each virtual server.
struct ap_conf_vector_t * module_config
const char * expr_vary_this
apr_bucket_brigade * tmp_bb
const char * undefined_echo
ap_expr_eval_ctx_t * expr_eval_ctx
apr_size_t undefined_echo_len
static void error_fmt(abts_case *tc, void *data)
Utilities for EBCDIC conversion.