On Sun, Jan 12, 2014 at 8:42 PM, <cove...@apache.org> wrote: > Author: covener > Date: Mon Jan 13 01:42:12 2014 > New Revision: 1557640 > > URL: http://svn.apache.org/r1557640 > Log: > restore http://svn.apache.org/viewvc?view=revision&revision=233369 > under a configurable option: don't run mod_dir if r->handler is already > set. > > PR53794 > > > Modified: > httpd/httpd/trunk/CHANGES > httpd/httpd/trunk/docs/manual/mod/mod_dir.xml > httpd/httpd/trunk/modules/mappers/mod_dir.c > > Modified: httpd/httpd/trunk/CHANGES > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=1557640&r1=1557639&r2=1557640&view=diff > > ============================================================================== > --- httpd/httpd/trunk/CHANGES [utf-8] (original) > +++ httpd/httpd/trunk/CHANGES [utf-8] Mon Jan 13 01:42:12 2014 > @@ -1,6 +1,10 @@ > -*- coding: > utf-8 -*- > Changes with Apache 2.5.0 > > + > + *) mod_dir: Add DirectoryCheckHandler to allow a 2.2-like behavior, > skipping > + execution when a handler is already set. PR53929. [Eric Covener] > + > *) mod_rewrite: Protect against looping with the [N] flag by enforcing a > default limit of 10000 iterations, and allowing each rule to change > its > limit. [Eric Covener] > > Modified: httpd/httpd/trunk/docs/manual/mod/mod_dir.xml > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_dir.xml?rev=1557640&r1=1557639&r2=1557640&view=diff > > ============================================================================== > --- httpd/httpd/trunk/docs/manual/mod/mod_dir.xml (original) > +++ httpd/httpd/trunk/docs/manual/mod/mod_dir.xml Mon Jan 13 01:42:12 2014 > @@ -274,5 +274,31 @@ a directory</description> > </highlight> > </usage> > </directivesynopsis> > +<directivesynopsis> > +<name>DirectoryCheckHandler</name> > +<description>Toggle how this module responds when another handler is > configured</description> > +<syntax>DirectoryCheckHandler On|Off</syntax> > +<default>DirectorySlash Off</default> > +<contextlist><context>server config</context><context>virtual > host</context> > +<context>directory</context><context>.htaccess</context></contextlist> > +<override>Indexes</override> > +<compatibility>Available in 2.4.8 and later. Releases prior to 2.4 > implicitly > +act as if "DirectorySlash Off" was specified.</compatibility> > +<usage> > + <p>The <directive>DirectoryCheckHandler</directive> directive > determines > + whether <module>mod_dir</module> should check for directory indexes or > + add trailing slashes when some other handler has been configured for > + the current URL. Handlers can be set by directives such as > + <directive module="core">SetHandler</directive> or by other modules, > + such as <module>mod_rewrite</module> during per-directory > substitutions. > + </p> > + > + <p> In releases prior to 2.4, this module did not take any action if > any > + other handler was configured for a URL. This allows directory indexes > to > + be served even when a <directive>SetHandler</directive> directive is > + specified for an entire directory, but it can also result in some > conflicts > + with modules such as <directive>mod_rewrite</directive>.</p> > +</usage> > +</directivesynopsis> >
At least one of the "DirectorySlash" occurrences is wrong. (I guess both are.) I wonder if there is a more intuitive directive name. What about DirectoryOverrideHandler? (with reversed sense of on/off) Is that more obvious than DirectoryCheckHandler? > </modulesynopsis> > > Modified: httpd/httpd/trunk/modules/mappers/mod_dir.c > URL: > http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/mappers/mod_dir.c?rev=1557640&r1=1557639&r2=1557640&view=diff > > ============================================================================== > --- httpd/httpd/trunk/modules/mappers/mod_dir.c (original) > +++ httpd/httpd/trunk/modules/mappers/mod_dir.c Mon Jan 13 01:42:12 2014 > @@ -44,6 +44,7 @@ typedef enum { > typedef struct dir_config_struct { > apr_array_header_t *index_names; > moddir_cfg do_slash; > + moddir_cfg checkhandler; > int redirect_index; > const char *dflt; > } dir_config_rec; > @@ -86,6 +87,13 @@ static const char *configure_slash(cmd_p > d->do_slash = arg ? MODDIR_ON : MODDIR_OFF; > return NULL; > } > +static const char *configure_checkhandler(cmd_parms *cmd, void *d_, int > arg) > +{ > + dir_config_rec *d = d_; > + > + d->checkhandler = arg ? MODDIR_ON : MODDIR_OFF; > + return NULL; > +} > static const char *configure_redirect(cmd_parms *cmd, void *d_, const > char *arg1) > { > dir_config_rec *d = d_; > @@ -123,6 +131,8 @@ static const command_rec dir_cmds[] = > "a list of file names"), > AP_INIT_FLAG("DirectorySlash", configure_slash, NULL, DIR_CMD_PERMS, > "On or Off"), > + AP_INIT_FLAG("DirectoryCheckHandler", configure_checkhandler, NULL, > DIR_CMD_PERMS, > + "On or Off"), > AP_INIT_TAKE1("DirectoryIndexRedirect", configure_redirect, > NULL, DIR_CMD_PERMS, "On, Off, or a 3xx status code."), > > @@ -135,6 +145,7 @@ static void *create_dir_config(apr_pool_ > > new->index_names = NULL; > new->do_slash = MODDIR_UNSET; > + new->checkhandler = MODDIR_UNSET; > new->redirect_index = REDIRECT_UNSET; > return (void *) new; > } > @@ -148,6 +159,8 @@ static void *merge_dir_configs(apr_pool_ > new->index_names = add->index_names ? add->index_names : > base->index_names; > new->do_slash = > (add->do_slash == MODDIR_UNSET) ? base->do_slash : add->do_slash; > + new->checkhandler = > + (add->checkhandler == MODDIR_UNSET) ? base->checkhandler : > add->checkhandler; > new->redirect_index= > (add->redirect_index == REDIRECT_UNSET) ? base->redirect_index : > add->redirect_index; > new->dflt = add->dflt ? add->dflt : base->dflt; > @@ -260,6 +273,10 @@ static int fixup_dir(request_rec *r) > return HTTP_MOVED_PERMANENTLY; > } > > + if (d->checkhandler == MODDIR_ON && strcmp(r->handler, > DIR_MAGIC_TYPE)) { > + return DECLINED; > + } > + > if (d->index_names) { > names_ptr = (char **)d->index_names->elts; > num_names = d->index_names->nelts; > > > -- Born in Roswell... married an alien... http://emptyhammock.com/