From fd5b05d56a133f75759e1d5a9a87c1c8dde27b4f Mon Sep 17 00:00:00 2001 From: Ken Coar Date: Sun, 1 Jun 2003 15:10:30 +0000 Subject: [PATCH] Allow ExpiresByType to accept and understand minor-type wildcards (e.g., text/*). They'll be used if an exact type match isn't found; if there's no wildcard match, the expiry falls back to any ExpiresDefault setting as usual. PR: 7991 git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@100126 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ modules/metadata/mod_expires.c | 43 +++++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index 441f091612..8c82474214 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.1.0-dev [Remove entries to the current 2.0 section below, when backported] + *) Add support for IMT minor-type wildcards (e.g., text/*) to + ExpiresByType. PR#7991 [Ken Coar] + *) Prevent the server from crashing when entering infinite loops. The new LimitInternalRecursion directive configures limits of subsequent internal redirects and nested subrequests, after which the request diff --git a/modules/metadata/mod_expires.c b/modules/metadata/mod_expires.c index 1b5691fec8..c15191f4ad 100644 --- a/modules/metadata/mod_expires.c +++ b/modules/metadata/mod_expires.c @@ -208,6 +208,7 @@ typedef struct { int active; + int wildcards; char *expiresdefault; apr_table_t *expiresbytype; } expires_dir_config; @@ -227,6 +228,7 @@ static void *create_dir_expires_config(apr_pool_t *p, char *dummy) expires_dir_config *new = (expires_dir_config *) apr_pcalloc(p, sizeof(expires_dir_config)); new->active = ACTIVE_DONTCARE; + new->wildcards = 0; new->expiresdefault = ""; new->expiresbytype = apr_table_make(p, 4); return (void *) new; @@ -357,7 +359,13 @@ static const char *set_expiresbytype(cmd_parms *cmd, void *in_dir_config, { expires_dir_config *dir_config = in_dir_config; char *response, *real_code; + char *check; + check = strrchr(mime, '/'); + if ((strlen(++check) == 1) && (*check == '*')) { + dir_config->wildcards = 1; + } + if ((response = check_code(cmd->pool, code, &real_code)) == NULL) { apr_table_setn(dir_config->expiresbytype, mime, real_code); return NULL; @@ -410,7 +418,7 @@ static void *merge_expires_dir_configs(apr_pool_t *p, void *basev, void *addv) else { new->expiresdefault = base->expiresdefault; } - + new->wildcards = add->wildcards; new->expiresbytype = apr_table_overlay(p, add->expiresbytype, base->expiresbytype); return new; @@ -508,8 +516,37 @@ static apr_status_t expires_filter(ap_filter_t *f, expiry = apr_table_get(conf->expiresbytype, ap_field_noparam(r->pool, r->content_type)); if (expiry == NULL) { - /* Use the ExpiresDefault directive */ - expiry = conf->expiresdefault; + int usedefault = 1; + /* + * See if we have a wildcard entry for the major type. + */ + if (conf->wildcards) { + char *checkmime; + char *spos; + checkmime = apr_pstrdup(r->pool, r->content_type); + spos = strchr(checkmime, '/'); + if (spos != NULL) { + /* + * Without a '/' character, nothing we have will match. + * However, we have one. + */ + if (strlen(++spos) > 0) { + *spos++ = '*'; + *spos = '\0'; + } + else { + checkmime = apr_pstrcat(r->pool, checkmime, "*", NULL); + } + expiry = apr_table_get(conf->expiresbytype, checkmime); + usedefault = (expiry == NULL); + } + } + if (usedefault) { + /* + * Use the ExpiresDefault directive + */ + expiry = conf->expiresdefault; + } } if (expiry != NULL) { set_expiration_fields(r, expiry, t); -- 2.50.1