brian 96/06/30 15:13:49
Modified: src mod_cern_meta.c Log: Submitted by: Andrew Wilson Andrew wrote: > This is the cern module rewritten for per-directory configuration > and now with the MetaFiles directive. Revision Changes Path 1.3 +76 -31 apache/src/mod_cern_meta.c Index: mod_cern_meta.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_cern_meta.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C3 -r1.2 -r1.3 *** mod_cern_meta.c 1996/03/11 09:14:41 1.2 --- mod_cern_meta.c 1996/06/30 22:13:46 1.3 *************** *** 52,62 **** /* * mod_cern_meta.c ! * version 0.0.5 * status beta * * Andrew Wilson <[EMAIL PROTECTED]> 25.Jan.96 * * Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP * headers that can be output in addition to the normal range of * headers for each file accessed. They appear rather like the Apache --- 52,69 ---- /* * mod_cern_meta.c ! * version 0.1.0 * status beta * * Andrew Wilson <[EMAIL PROTECTED]> 25.Jan.96 * + * *** IMPORTANT *** + * This version of mod_cern_meta.c controls Meta File behaviour on a + * per-directory basis. Previous versions of the module defined behaviour + * on a per-server basis. The upshot is that you'll need to revisit your + * configuration files in order to make use of the new module. + * *** + * * Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP * headers that can be output in addition to the normal range of * headers for each file accessed. They appear rather like the Apache *************** *** 67,74 **** * who can exploit this module. It should be noted that there are probably * more sensitive ways of managing the Expires: header specifically. * ! * The module obeys the following directives, which can only appear ! * in the server's .conf files and not in any .htaccess file. * * MetaDir <directory name> * --- 74,89 ---- * who can exploit this module. It should be noted that there are probably * more sensitive ways of managing the Expires: header specifically. * ! * The module obeys the following directives, which can appear ! * in the server's .conf files and in .htaccess files. ! * ! * MetaFiles <on|off> ! * ! * turns on|off meta file processing for any directory. ! * Default value is off ! * ! * # turn on MetaFiles in this directory ! * MetaFiles on * * MetaDir <directory name> * *************** *** 122,128 **** * need to report missing ones as spurious errors. * 31.Jan.96 log_error reports about a malformed .meta file, rather * than a script error. ! * */ #include "httpd.h" --- 137,146 ---- * need to report missing ones as spurious errors. * 31.Jan.96 log_error reports about a malformed .meta file, rather * than a script error. ! * 20.Jun.96 MetaFiles <on|off> default off, added, so that module ! * can be configured per-directory. Prior to this the module ! * was running for each request anywhere on the server, naughty.. ! * 29.Jun.96 All directives made per-directory. */ #include "httpd.h" *************** *** 132,182 **** #include "util_script.h" #include "http_log.h" #define DEFAULT_METADIR ".web" #define DEFAULT_METASUFFIX ".meta" module cern_meta_module; typedef struct { char *metadir; char *metasuffix; ! } cern_meta_config; ! void *create_cern_meta_config (pool *p, server_rec *dummy) { ! cern_meta_config *new = ! (cern_meta_config *) palloc (p, sizeof(cern_meta_config)); ! ! new->metadir = DEFAULT_METADIR; ! new->metasuffix = DEFAULT_METASUFFIX; return new; } - char *set_metadir (cmd_parms *parms, void *dummy, char *arg) - { - cern_meta_config *cmc ; ! cmc = get_module_config (parms->server->module_config, ! &cern_meta_module); ! cmc->metadir = arg; return NULL; } ! char *set_metasuffix (cmd_parms *parms, void *dummy, char *arg) { ! cern_meta_config *cmc ; ! cmc = get_module_config (parms->server->module_config, ! &cern_meta_module); ! cmc->metasuffix = arg; return NULL; } command_rec cern_meta_cmds[] = { ! { "MetaDir", set_metadir, NULL, RSRC_CONF, TAKE1, "the name of the directory containing meta files"}, ! { "MetaSuffix", set_metasuffix, NULL, RSRC_CONF, TAKE1, "the filename suffix for meta files"}, { NULL } }; --- 150,220 ---- #include "util_script.h" #include "http_log.h" + #define DIR_CMD_PERMS OR_INDEXES + #define DEFAULT_METADIR ".web" #define DEFAULT_METASUFFIX ".meta" + #define DEFAULT_METAFILES 0 module cern_meta_module; typedef struct { char *metadir; char *metasuffix; ! char *metafiles; ! } cern_meta_dir_config; ! void *create_cern_meta_dir_config (pool *p, char *dummy) { ! cern_meta_dir_config *new = ! (cern_meta_dir_config *) palloc (p, sizeof(cern_meta_dir_config)); ! ! new->metadir = NULL; ! new->metasuffix = NULL; ! new->metafiles = DEFAULT_METAFILES; ! ! return new; ! } ! ! void *merge_cern_meta_dir_configs (pool *p, void *basev, void *addv) ! { ! cern_meta_dir_config *base = (cern_meta_dir_config *)basev; ! cern_meta_dir_config *add = (cern_meta_dir_config *)addv; ! cern_meta_dir_config *new = ! (cern_meta_dir_config *)palloc (p, sizeof(cern_meta_dir_config)); ! ! new->metadir = add->metadir ? add->metadir : base->metadir; ! new->metasuffix = add->metasuffix ? add->metasuffix : base->metasuffix; ! new->metafiles = add->metafiles; return new; } ! char *set_metadir (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) ! { ! dconf->metadir = arg; return NULL; } ! char *set_metasuffix (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) { ! dconf->metasuffix = arg; ! return NULL; ! } ! char *set_metafiles (cmd_parms *parms, cern_meta_dir_config *dconf, char *arg) ! { ! dconf->metafiles = arg; return NULL; } + command_rec cern_meta_cmds[] = { ! { "MetaFiles", set_metafiles, NULL, DIR_CMD_PERMS, FLAG, NULL}, ! { "MetaDir", set_metadir, NULL, DIR_CMD_PERMS, TAKE1, "the name of the directory containing meta files"}, ! { "MetaSuffix", set_metasuffix, NULL, DIR_CMD_PERMS, TAKE1, "the filename suffix for meta files"}, { NULL } }; *************** *** 240,250 **** char *scrap_book; struct stat meta_stat; FILE *f; ! cern_meta_config *cmc ; int rv; ! cmc = get_module_config (r->server->module_config, ! &cern_meta_module); /* if ./.web/$1.meta exists then output 'asis' */ --- 278,291 ---- char *scrap_book; struct stat meta_stat; FILE *f; ! cern_meta_dir_config *dconf ; int rv; ! dconf = get_module_config (r->per_dir_config, &cern_meta_module); ! ! if (!dconf->metafiles) { ! return DECLINED; ! }; /* if ./.web/$1.meta exists then output 'asis' */ *************** *** 274,280 **** return DECLINED; }; ! metafilename = pstrcat(r->pool, "/", scrap_book, "/", cmc->metadir, "/", real_file, cmc->metasuffix, NULL); /* * stat can legitimately fail for a bewildering number of reasons, --- 315,325 ---- return DECLINED; }; ! metafilename = pstrcat(r->pool, "/", scrap_book, "/", ! dconf->metadir ? dconf->metadir : DEFAULT_METADIR, ! "/", real_file, ! dconf->metasuffix ? dconf->metasuffix : DEFAULT_METASUFFIX, ! NULL); /* * stat can legitimately fail for a bewildering number of reasons, *************** *** 314,322 **** module cern_meta_module = { STANDARD_MODULE_STUFF, NULL, /* initializer */ ! NULL, /* dir config creater */ ! NULL, /* dir merger --- default is to override */ ! create_cern_meta_config, /* server config */ NULL, /* merge server configs */ cern_meta_cmds, /* command table */ NULL, /* handlers */ --- 359,367 ---- module cern_meta_module = { STANDARD_MODULE_STUFF, NULL, /* initializer */ ! create_cern_meta_dir_config, /* dir config creater */ ! merge_cern_meta_dir_configs, /* dir merger --- default is to override */ ! NULL, /* server config */ NULL, /* merge server configs */ cern_meta_cmds, /* command table */ NULL, /* handlers */