This patch does the following things: - Morphs ap_run_sub_req-invoked handler's DONE to OK. (Fixes mod_dav always returning DONE and mod_include treating it as an error.) - Adds 'ModMimeUsePathInfo' flag directive which tells mod_mime to use the full URI to do type lookups rather than r->filename. - Allows mod_dav to be involved for subreqs. - Switches mod_dav to use fixups for its handler config to allow mod_mime to run.
Any complaints before committing? I can now serve mod_include-based pages directly out of SVN. Woo! If PHP worked on non-file-backed data, it would work too. -- justin Index: server/request.c =================================================================== RCS file: /home/cvs/httpd-2.0/server/request.c,v retrieving revision 1.114 diff -u -r1.114 request.c --- server/request.c 17 May 2002 11:11:37 -0000 1.114 +++ server/request.c 4 Sep 2002 21:07:24 -0000 @@ -1867,6 +1867,9 @@ } if (retval != OK) { retval = ap_invoke_handler(r); + if (retval == DONE) { + retval = OK; + } } ap_finalize_sub_req_protocol(r); return retval; Index: modules/dav/main/mod_dav.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/dav/main/mod_dav.c,v retrieving revision 1.84 diff -u -r1.84 mod_dav.c --- modules/dav/main/mod_dav.c 3 Aug 2002 19:36:32 -0000 1.84 +++ modules/dav/main/mod_dav.c 4 Sep 2002 21:07:25 -0000 @@ -4429,8 +4429,8 @@ return DECLINED; } - /* quickly ignore any HTTP/0.9 requests */ - if (r->assbackwards) { + /* quickly ignore any HTTP/0.9 requests which aren't subreqs. */ + if (r->assbackwards && !r->main) { return DECLINED; } @@ -4595,7 +4595,7 @@ return DECLINED; } -static int dav_type_checker(request_rec *r) +static int dav_fixups(request_rec *r) { dav_dir_conf *conf; @@ -4635,8 +4635,6 @@ * ### we lock down this hierarchy so that we are the ultimate * ### arbiter? (or do we simply depend on the administrator * ### to avoid conflicting configurations?) - * - * ### I think the OK stops running type-checkers. need to look. */ r->handler = "dav-handler"; return OK; @@ -4649,7 +4647,7 @@ { ap_hook_handler(dav_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_config(dav_init_handler, NULL, NULL, APR_HOOK_MIDDLE); - ap_hook_type_checker(dav_type_checker, NULL, NULL, APR_HOOK_FIRST); + ap_hook_fixups(dav_fixups, NULL, NULL, APR_HOOK_MIDDLE); dav_hook_find_liveprop(dav_core_find_liveprop, NULL, NULL, APR_HOOK_LAST); dav_hook_insert_all_liveprops(dav_core_insert_all_liveprops, Index: modules/http/mod_mime.c =================================================================== RCS file: /home/cvs/httpd-2.0/modules/http/mod_mime.c,v retrieving revision 1.86 diff -u -r1.86 mod_mime.c --- modules/http/mod_mime.c 18 May 2002 04:13:13 -0000 1.86 +++ modules/http/mod_mime.c 4 Sep 2002 21:07:25 -0000 @@ -127,6 +127,9 @@ int multimatch; /* Extensions to include in multiview matching * for filenames, e.g. Filters and Handlers */ + int use_path_info; /* If set to 0, only use filename. Otherwise, + * appned PATH_INFO to filename for lookups. + */ } mime_dir_config; typedef struct param_s { @@ -162,6 +165,8 @@ new->multimatch = MULTIMATCH_UNSET; + new->use_path_info = 0; + return new; } /* @@ -267,6 +272,9 @@ new->multimatch = (add->multimatch != MULTIMATCH_UNSET) ? add->multimatch : base->multimatch; + new->use_path_info = add->use_path_info ? + add->use_path_info : base->use_path_info; + return new; } @@ -430,6 +438,9 @@ "one or more file extensions"), AP_INIT_TAKE1("TypesConfig", set_types_config, NULL, RSRC_CONF, "the MIME types config file"), + AP_INIT_FLAG("ModMimeUsePathInfo", ap_set_flag_slot, + (void *)APR_OFFSETOF(mime_dir_config, use_path_info), ACCESS_CONF, + "Set to 'yes' to allow mod_mime to use path info for type checking"), {NULL} }; @@ -764,7 +775,7 @@ mime_dir_config *conf; apr_array_header_t *exception_list; char *ext; - const char *fn, *type, *charset = NULL; + const char *fn, *type, *charset = NULL, *resource_name; int found_metadata = 0; if (r->finfo.filetype == APR_DIR) { @@ -776,10 +787,17 @@ &mime_module); exception_list = apr_array_make(r->pool, 2, sizeof(char *)); + if (!conf->use_path_info) { + resource_name = r->filename; + } + else { + resource_name = r->uri; + } + /* Always drop the path leading up to the file name. */ - if ((fn = strrchr(r->filename, '/')) == NULL) { - fn = r->filename; + if ((fn = strrchr(resource_name, '/')) == NULL) { + fn = resource_name; } else { ++fn;