]> granicus.if.org Git - apache/commitdiff
Allow ExpiresByType to accept and understand minor-type wildcards
authorKen Coar <coar@apache.org>
Sun, 1 Jun 2003 15:10:30 +0000 (15:10 +0000)
committerKen Coar <coar@apache.org>
Sun, 1 Jun 2003 15:10:30 +0000 (15:10 +0000)
(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
modules/metadata/mod_expires.c

diff --git a/CHANGES b/CHANGES
index 441f091612592ae65db4d5071cb784662fdcbf38..8c8247421470181e988b57d0a4c26b8e031739ad 100644 (file)
--- 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
index 1b5691fec8b56a9a6640e085127f6e829f045993..c15191f4adc226237f6c135821513785d3912e8e 100644 (file)
 
 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);